编辑
2023-12-02
JVM
00
请注意,本文编写于 573 天前,最后修改于 572 天前,其中某些信息可能已经过时。

JVM的内存分配器和内存分配机制是指在Java虚拟机中,如何为对象分配内存空间以及如何管理和回收这些内存空间的过程。

一、对象的创建过程

image.png 在JVM中,当我们使用new关键字创建一个对象时,会经历以下几个步骤:

  1. 类加载检查:虚拟机会检查new指令的参数是否能在常量池中定位到一个类的符号引用,并检查该类是否已经被加载、解析和初始化过

  2. 内存分配:在类加载检查通过后,虚拟机会为新生对象分配内存空间。内存分配的方法有两种:

    a. 指针碰撞:如果Java堆中的内存是规整的,已使用的内存和空闲的内存相互交错,虚拟机可以通过将一个指针指向空闲空间的起始位置来分配内存

    b. 空闲列表:如果Java堆中的内存不规整,已使用的内存和空闲的内存相互交错,虚拟机需要维护一个列表来记录哪些内存是已使用的,哪些是空闲的

    在并发情况下,为了解决多线程同时分配内存的问题,虚拟机采用CAS(compare and swap)和本地线程分配缓冲(TLAB)等机制来保证内存分配的原子性和线程安全性

  3. 初始化:内存分配完成后,虚拟机会将分配到的内存空间初始化为零值,包括对象头和实例数据。这一步骤保证了对象的实例字段在Java代码中可以直接使用而不需要赋初始值

  4. 设置对象头:初始化零值分配后,虚拟机会设置对象头,包括对象的运行时数据和类型指针。对象头存储了对象的哈希码、GC分代年龄等信息,以及指向对象的类型元数据的指针

  5. 调用方法:最后,虚拟机会执行对象的构造方法,按照程序开发者的意愿进行初始化,为对象的属性赋值

二、对象的大小与指针压缩

在JVM中,对象的大小由对象的实例数据和对象头组成。对象头包含了对象的运行时数据和类型指针,而实例数据则是对象的属性值。对象的大小可以通过工具类来获取,例如使用org.openjdk.jol:jol-core库来打印对象的内存布局信息

指针压缩是一种优化技术,用于减少对象指针的大小。在32位的JVM中,对象指针的大小为4字节,而在64位的JVM中,对象指针的大小为8字节。由于大部分应用程序中对象的地址空间并不会超过32位或64位的范围,因此可以通过指针压缩技术将对象指针的大小减小为4字节或8字节,从而节省内存空间


Learn more:

  1. JVM 内存分配机制,一次讲够! - 掘金
  2. 8.JVM内存分配机制超详细解析 - 盛开的太阳 - 博客园
  3. JVM内存划分、JVM内存分配机制、JVM垃圾回收机制_java虚拟机内存划分-CSDN博客

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!