本文主要是介绍JVM对象创建与内存分配机制深度剖析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、对象的创建
1、类加载检查
2、分配内存
(1)划分内存的方法:
1)指针碰撞(默认)
2)空闲列表
(2)解决并发问题的方法:
1)CAS(compare and swap)
2)本地线程分配缓冲
3、初始化零值
4、设置对象头
对象在内存中存点布局可以分为3块领域:对象头、实例数据和对齐填充。
5、执行<init>方法(程序员赋值、执行构造方法)
二、对象大小与指针压缩
1、什么是java对象的指针压缩
从jdk1.6 update14开始,在64bit操作系统中,JVM支持指针压缩。
2、为什么要进行指针压缩?
提高效率(减少内存占用、GC压力)
关于对齐填充:对于大部分处理器,对象以8字节整数倍来对齐填充都是最高效的存取方式。
三、对象内存分配
1、对象内存分配流程图
2、对象栈上分配
JVM通过逃逸分享确定该队形不会被外部访问。如果不会逃逸可以将对象在栈上分配。
对象逃逸分析:就是分析对象动态作用域,当一个对象在方法中被定义后,它可能被外部方法所使用,例如:作为调用参数传递到其他地方中。
标量替换:通过逃逸分析确定该对象不会被外部访问时,JVM不会创建该对象,而是将该对象成员变量分解若干个被这个方法使用的成员变量所代替。
3、对象在Eden区分配
4、大对象直接进入老年代
5、长期存活的对象将进入老年代
6、对象动态年龄判断
年龄1+年龄2+年龄n的多个年龄对象总和超过了Survivor区域的50%,此时就会把年龄n(含)以上的对象都放入老年代
7、老年代空间分配担保机制
提前预判,看看老年代的可用内存大小,是否大于之前每一次minor gc后进入老年代的对象的平均大小。预判成功,直接进入full gc。预判失败,重新minor gc。
四、对象内存回收
1、引用计数法
2、可达性分析算法
将GC Roots对象作为起点,从这些节点开始向下搜索引用的对象,找到的对象都标记为非垃圾对象,其余未标记的对象都是垃圾对象。
GC Roots根节点:线程栈的本地变量、静态变量、本地方法栈的变量等等。
3、常规引用类型
java的引用类型一般分为四种:强引用、软引用、弱引用、虚引用
4、finalize()方法最终判定对象是否存活
5、如何判定一个类是无用的类
(1)该类所有的对象实例都已经被回收,也就是java堆中不存在该类的任何实例;
(2)加载该类的ClassLoader已经被回收
(3)该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射该类的方法。
这篇关于JVM对象创建与内存分配机制深度剖析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!