当前位置: 首页 > 后端技术 > Java

【JVM知识汇总-2】HotSpot虚拟机对象

时间:2023-04-01 13:55:57 Java

【JVM知识汇总-1】JVM内存模型【JVM知识汇总-2】HotSpot虚拟机对象【JVM知识汇总-3】垃圾回收策略与算法【JVM知识小结-4】HotSpot垃圾收集器【JVM知识小结-5】内存分配与回收策略【JVM知识小结-6】JVM性能调优【JVM知识小结-7】Class文件结构【JVM知识小结-8】类【JVM知识小结】总结-9]类加载的过程[JVM知识总结-10]类加载器对象的内存布局头对象(Header)实例数据(InstanceData)对齐填充(Padding)头对象头对象记录了该对象的一些数据运行过程中需要用到:hashcodeGCgenerationalagelockstatusflag线程持有的锁偏向线程ID偏向时间戳对象头可能包含一个类型指针,通过它可以判断该对象属于哪个对象。如果对象是数组,则对象头还包括数组长度。实例数据实例数据部分是成员变量的值,包括父类成员和本类的成员变量。对齐填充用于确保对象的总长度是8字节的数据倍数。HotSpotVM的自动内存管理系统要求对象大小必须是8字节的整数倍。对象头部分恰好是8字节的倍数(1或2倍)。因此,当对象实例数据部分没有对齐时,需要通过对齐填充来完成。Alignmentpadding不一定存在也没有特殊意义,只是起到占位符的作用。对象创建过程类加载检查当虚拟机在解析一个.被加载、解析和初始化。如果没有,如果没有则必须先执行类加载过程。为新对象分配内存对象需要的内存大小在类加载完成后就完全确定了,然后从堆中为新对象分配相应大小的内存空间。堆内存的分配方式有两种:指针碰撞如果Java堆中的内存是绝对规则的(说明使用了“复制算法”或“标记法”),则在空闲内存和已用内存之间放置一个指针作为分界点指标,那么在分配内存时,只需要将指针指向空闲内存移动与对象大小相等的距离即可。这种分配方式称为“指针冲突”。freelist如果Java堆中的内存是无规律的,使用的内存和空间内存是交错的(说明用了mark-sweep的方式,有碎片),这时候就没有办法简单的碰撞指针了。VM必须维护一个列表并记录它。哪些内存块可以免费使用。分配时,从空闲链表中找到足够大的内存空间分配给对象实例。这种方法称为“自由列表”。初始化分配内存后,给对象成员变量赋初值,设置对象头信息,调用对象的构造方法进行初始化。大家好,整个对象创建过程就完成了。对象访问方式所有对象的存储空间都分配在堆中,但是这个对象的引用确实分配在Java栈中的局部变量表中。也就是说,当一个对象被创建时,两处都分配了内存。堆中分配的内存是为了真正创建对象。句柄访问方式需要在堆中有一个叫做“句柄池”的内存空间,句柄中包含对象实例。分别是数据和类型数据的具体地址信息。引用类型的变量存储对象的句柄地址(引用)。在访问一个对象时,首先需要通过一个引用类型的变量找到对象的句柄,然后根据对象在句柄中的地址找到对象。直接指针访问方式中引用类型的变量直接存储对象的地址,这样就不需要句柄池,可以直接通过引用访问对象。但是对象所在的内存空间需要额外的策略来存储对象所属的类信息的地址。