本文共 729 字,大约阅读时间需要 2 分钟。
当我们执行 Cat cat = new Cat(); 这一行代码时,JVM内部会经历一系列步骤来完成对象的创建。以下是这些步骤的详细说明:
类加载检查:
- JVM首先检查Cat类是否已经加载。如果尚未加载,它会从类路径中寻找Cat.class文件,并执行加载、解析和初始化过程。
内存分配:
- JVM在堆内存中分配足够大小的连续空间来存放Cat对象。
- 内存分配的方式主要有两种:
- 指针碰撞(Bump the Pointer):适用于内存布局规整的情况,通过移动指针来分配内存。
- 空闲列表(Free List):用于不规整的内存布局,JVM维护一个空闲列表来查找可用内存块。
- 在并发环境下,JVM采用CAS+失败重试机制和本地线程分配缓冲(TLAB)来解决线程竞争问题,确保内存分配的原子性和高效性。
初始化零值:
- 内存分配完成后,JVM将内存空间初始化为零值。成员变量的值根据其数据类型初始化(如字符串为null,整数为0)。
- 如果使用TLAB,初始化过程可以在分配时同时进行,提高效率。
设置对象头:
- 对象头包括Mark Word和类型指针。Mark Word存储运行时数据,如哈希码、GC分代年龄、锁状态等。
- 类型指针指向类的元数据指针,默认使用指针压缩,减少内存占用。
执行 方法 :
- 在初始化零值后,JVM执行 方法,执行构造函数,赋值对象的属性,完成对象的初始化。
对象布局与GC:
- 对象在内存中的布局包括对象头、实例数据和对齐填充,确保存取效率。
- 垃圾回收机制(如Serial、ParNew、G1)根据不同算法对内存进行回收,管理空闲列表或直接回收。
通过了解这些步骤,我们可以更深入地理解Java对象的内存管理机制,优化应用性能并解决内存相关问题。
转载地址:http://txcfk.baihongyu.com/