2018.8.25 JVM
2024-08-28 23:14:31
一、JVM内存区域
Java虚拟机在运行时,会把内存空间分为若干个区域,根据《Java虚拟机规范(Java SE 7 版)》的规定,Java虚拟机所管理的内存区域分为如下部分:
方法区
堆内存
虚拟机栈
本地方法栈
程序计数器。
1、方法区
方法区主要用于存储虚拟机加载的类信息、常量、静态变量,以及编译器编译后的代码等数据。在jdk1.7及其之前,方法区是堆的一个“逻辑部分”(一片连续的堆空间),但为了与堆做区分,方法区还有个名字叫“非堆”,也有人用“永久代”(HotSpot对方法区的实现方法)来表示方法区。
从jdk1.7已经开始准备“去永久代”的规划,jdk1.7的HotSpot中,已经把原本放在方法区中的静态变量、字符串常量池等移到堆内存中,(常量池除字符串常量池还有class常量池等),这里只是把字符串常量池移到堆内存中;在jdk1.8中,方法区已经不存在,原方法区中存储的类信息、编译后的代码数据等已经移动到了元空间(MetaSpace)中,元空间并没有处于堆内存上,而是直接占用的本地内存(NativeMemory)。
去永久代的原因有:
(1)字符串存在永久代中,容易出现性能问题和内存溢出。
(2)类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出。
(3)永久代会为 GC 带来不必要的复杂度,并且回收效率偏低。
2.堆内存
堆内存主要用于存放对象和数组,它是JVM管理的内存中最大的一块区域,堆内存和方法区都被所有线程共享,在虚拟机启动时创建。在垃圾收集的层面上来看,由于现在收集器基本上都采用分代收集算法,因此堆还可以分为新生代(YoungGeneration)和老年代(OldGeneration),新生代还可以分为Eden、From Survivor、To Survivor。
3、程序计数器
程序计数器是一块非常小的内存空间,可以看做是当前线程执行字节码的行号指示器,每个线程都有一个独立的程序计数器,因此程序计数器是线程私有的一块空间,此外,程序计数器是Java虚拟机规定的唯一不会发生内存溢出的区域。
最新文章
- jedis2.4.2连接池配置说明
- 分布式服务框架dubbo原理解析(转)
- Python爬虫学习1
- ssl原理,非对称加密握手,对称加密传输
- 【python】继承时注意事项
- 【20160924】GOCVHelper综述
- Xmarks丢失书签
- listActivity和ExpandableListActivity的简单用法
- 从数据库读取数据后显示成html标签
- C# 与 VB.NET 对比
- unity3d简单的相机跟随及视野旋转缩放
- EduSoho程序上线实录
- 织梦autoindex应用 dedecms循环中判断第几条数据
- VxWorks嵌入式系统几种常用的延时方法
- java.lang.IllegalArgumentException: No Retrofit annotation found. (parameter #1) for method ApiService.getMethod
- 开发者和系统管理者最喜爱的开源工具Vim 起步学习的五个技巧
- Python3 移动文件——合集
- 当因式分解遇见近邻:一种多层面协同过滤模型(SVD++)
- C#中DEV控件,XtraTabPage得小方法
- LINUX学习资源