HotSpot虚拟机对象
我在网上看了很多相关的文章,发现在创建对象和对象的结构中内容都不太一样,一些关键字也很不同,于是我通过参考《深入理解Java虚拟机》这本书,自己总结了一篇。
1.对象的创建
- 当JVM收到一条创建对象的字节码new指令时,会先去检查这个指令的参数能否能在常量池中定义到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载,解析和初始化过,如果没有就先执行相应的类加载过程。
- 在类加载检查通过以后,就为新生对象分配内存,从堆中进行划分,划分方式有两种:指针碰撞,空闲列表,根据堆内存是否时规整的进行选择,规整的话就是指针碰撞,不规整就是空闲列表,当然,堆内存是否规整又由所采用的垃圾收集器是否带有空间压缩整理的能力决定。
- 内存分配完成之后,虚拟机必须将分配的内存空间(但不包括对象头)都初始化为0(这步操作保证了对象的实例字段在Java代码中可以不赋初始值就直接使用,使程序能访问到这些字段的数据类型所对应的零值)
- 对对象进行必要的设置。
2.对象的内存布局
在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头,实例数据,对齐填充。
对象头由两部分组成:
- 第一部分存储对象自身的运行时数据:哈希码、GC分代年龄、锁标识状态、线程持有的锁、偏向线程ID(一般占32/64 bit)。
- 第二部分是指针类型,指向对象的类元数据类型(即对象代表哪个类)。
如果是数组对象,则对象头中还有一部分用来记录数组长度。
实例数据用来存储对象真正的有效信息(包括父类继承下来的和自己定义的)
对齐填充:JVM要求对象起始地址必须是8字节的整数倍(8字节对齐)
3.判断对象是否能被回收
判断对象是否能被回收需要先判断对象是否存活,而判断对象是否存活一般有两种方式:
引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计
数为0时可以回收。此方法简单,无法解决对象相互循环引用的问题。
可达性分析(Reachability Analysis):从GC Roots开始向下搜索,搜索所走过的路径称为引
用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,是不可达对
象。
原文链接:JVM · 语雀
近日总结:最近好困啊,早上起来困的难受,学习的时候头晕眼花的,我觉得我应该是因为早上没有吃早饭所以才这样的,看来以后得吃早饭了,或者是吃多点,唉,难受。