JVM的内存分配器和内存分配机制是指在Java虚拟机中,如何为对象分配内存空间以及如何管理和回收这些内存空间的过程。
一、对象的创建过程
在JVM中,当我们使用new关键字创建一个对象时,会经历以下几个步骤:
类加载检查:虚拟机会检查new指令的参数是否能在常量池中定位到一个类的符号引用,并检查该类是否已经被加载、解析和初始化过
内存分配:在类加载检查通过后,虚拟机会为新生对象分配内存空间。内存分配的方法有两种:
a. 指针碰撞:如果Java堆中的内存是规整的,已使用的内存和空闲的内存相互交错,虚拟机可以通过将一个指针指向空闲空间的起始位置来分配内存
b. 空闲列表:如果Java堆中的内存不规整,已使用的内存和空闲的内存相互交错,虚拟机需要维护一个列表来记录哪些内存是已使用的,哪些是空闲的
在并发情况下,为了解决多线程同时分配内存的问题,虚拟机采用CAS(compare and swap)和本地线程分配缓冲(TLAB)等机制来保证内存分配的原子性和线程安全性
初始化:内存分配完成后,虚拟机会将分配到的内存空间初始化为零值,包括对象头和实例数据。这一步骤保证了对象的实例字段在Java代码中可以直接使用而不需要赋初始值
设置对象头:初始化零值分配后,虚拟机会设置对象头,包括对象的运行时数据和类型指针。对象头存储了对象的哈希码、GC分代年龄等信息,以及指向对象的类型元数据的指针
调用方法:最后,虚拟机会执行对象的构造方法,按照程序开发者的意愿进行初始化,为对象的属性赋值
二、对象的大小与指针压缩
在JVM中,对象的大小由对象的实例数据和对象头组成。对象头包含了对象的运行时数据和类型指针,而实例数据则是对象的属性值。对象的大小可以通过工具类来获取,例如使用org.openjdk.jol:jol-core
库来打印对象的内存布局信息
指针压缩是一种优化技术,用于减少对象指针的大小。在32位的JVM中,对象指针的大小为4字节,而在64位的JVM中,对象指针的大小为8字节。由于大部分应用程序中对象的地址空间并不会超过32位或64位的范围,因此可以通过指针压缩技术将对象指针的大小减小为4字节或8字节,从而节省内存空间
Learn more:
本文作者:yowayimono
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!