博客
关于我
new对象时,JVM内部究竟藏了什么小秘密?
阅读量:789 次
发布时间:2023-02-15

本文共 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/

    你可能感兴趣的文章