JVM_自动内存管理机制

运行时数据区域

java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同点数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和接受二建立和销毁。
主要内容:内存各个区域,区域的作用,服务对象,产生的问题
JVM_自动内存管理机制
文章图片

程序计数器
每条线程都要有一个独立的程序计数器
如果是正在执行的是JAVA方法,这个计算器记录的是正在执行的虚拟机自己买指令地址
如果是正在执行的是native方法,这个计数器值为空。
JAVA虚拟机栈
线程私有的
方法执行时创建帧栈,存储局部变量表,操作数栈,动态链接,方法出口
栈深度大于模拟机所允许的深度,抛StackOverflowErro异常
如果无法申请到足够内存,抛OutOfMemoryError异常
JAVA堆
内存最大一块,所有线程共享一块内存区域
在虚拟机创建时创建
所有对象实例已经数组都要在堆上分配。
JAVA堆屎垃圾收集器管理的主要区域GC堆
对于分代GC来说,堆是分代的
如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常
方法区
与JAVA堆一样是各个线程共享的内存区域
存储已经被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码
通常和永久代在一起
这个区域的内存回收目标主要是针对常量池的会后和对类型的卸载
无法满足内存分配需求时,将抛出OutOfMemoryError
运行时常量池
运行时常量池是方法区的一部分
class文件中除了有泪的版本,字段,方法,接口描述信息,还有事常量池,用于存放编译期生成的各种字面量和符号引用。
当常量池无法在申请到内存时会抛出OutOfMemoryError异常
直接内存
不是虚拟机运行时数据区一部分,也不是java虚拟机规范中定义的内存区域。
这部分内存频繁使用,导致OutOfMemoryError(内存区域综合大于物理内存限制)

HotSpot虚拟机对象探秘
进一步了解这些虚拟机内存中的数据的其他细节,譬如他们是如创建,如何布局以及如何访问的。
对象的创建
1.new指令时,检查这个指令的参数是否在常量池中定位到一个类的符号引用。
2.检查这个符号引用代表的类是否已被加载,解析,初始化过。
3.为新生对象分配内存,从堆上划分一块内存
4.对对象进行必要的设置,例如对象是那个类的实例,如何找到元数据对象的GC分代年龄,这些信息存到对象头中
5.执行init方法,将对象按照程序员的意愿进行初始化
对象内存布局
对象在内存中存储的布局:对象头,实例数据,对其填充
对象头
存储对象自身的运行时数据,主要存储内容如下:
JVM_自动内存管理机制
文章图片

类型指针
指向它的元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
实例数据
对象真正存储的有效信息,各种类型字段内容。
对其填充
占位符作用

对象的访问定位
使用句柄
java堆中将会哈ufenchuyikuai内存来作为句柄池。reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息
JVM_自动内存管理机制
文章图片
直接指针
java堆对象的布局中就必须考虑如何防止访问类型属鸡的相关信息,而reference中存储的直接就是对象地址
JVM_自动内存管理机制
文章图片

总结
【JVM_自动内存管理机制】这一部分内容主要学习了内存是如何划分的,哪部分区域,讲解这些区域的作用,服务对象。






    推荐阅读