Java对象创建过程的解析
- 1. 类的加载与连接
- 2. 内存分配
- 2.1 分配方式
- 2.2 本地线程缓冲分配(TLAB)
- 3. 初始化内存
- 4. 设置对象头
💖The Begin💖点点关注,收藏不迷路💖 |
对象的创建是一个涉及多个步骤的复杂过程,但我们可以将其简化为几个核心环节来理解。
1. 类的加载与连接
当JVM(Java虚拟机)遇到一条新建对象的指令时,它首先会检查这条指令所引用的类是否已经被加载。
类的加载是类加载器(ClassLoader)的任务,它负责将类的二进制数据从硬盘加载到JVM的方法区中,并在内存中生成对应的java.lang.Class
对象。类的加载之后,会进行连接(包括验证、准备和解析)等阶段,确保类的正确性并准备好类的信息。
2. 内存分配
2.1 分配方式
- 指针碰撞(Bump the Pointer):适用于内存规整的情况,即已用内存和未用内存界限分明,分配内存时只需将指针向空闲内存方向移动即可。
- 空闲列表(Free List):适用于内存不规整的情况,JVM会维护一个记录空闲内存块的列表,分配内存时从列表中查找合适的空闲块。
2.2 本地线程缓冲分配(TLAB)
==为了提高内存分配的效率,JVM通常使用本地线程缓冲分配(Thread Local Allocation Buffer, TLAB)的方式。==每个线程在Java堆中预先分配一小块内存,称为TLAB。线程在分配小对象时,会优先在自己的TLAB中进行,这样可以减少线程间的同步开销,提高内存分配的效率。
3. 初始化内存
分配好内存后,JVM会将分配到的内存空间(除了对象头)初始化为零值。这是为了确保对象的字段在未被显式初始化之前有一个确定的初始状态。
4. 设置对象头
对象头是对象内存布局的一部分,它包含了对象的元数据信息,如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。在内存分配并初始化后,JVM会设置对象头的这些信息,以便后续对对象进行管理和操作。
💖The End💖点点关注,收藏不迷路💖 |