JVM 对象分配过程

发布时间 2023-10-13 17:10:49作者: 之士咖啡

对象分配过程

  1. 依据逃逸分析,判断是否能栈上分配?
    1. 如果不存在逃逸,该对象就可以通过标量替换分解成成员标量分配在栈内存中,和方法的生命周期一致,随着栈帧出栈时销毁,减少了 GC 压力,提高了应用程序性能。
    2. 否则,继续下一步。
  2. 判断是否大对象?
    1. 如果是,直接分配到堆上 Old Generation 老年代上。如果对象变为垃圾后,由老年代GC 收集器(比如 Parallel Old, CMS, G1)回收。
    2. 否则,继续下一步。
  3. 判断是否可以在 TLAB中分配?
    1. 如果是,分配到 TLAB 中。TLAB 为本地缓存分配区,在Eden 区中。如果分配失败(对象大于当前TLAB所能存放的空间),重新分配一个TLAB区进行对象分配。如果还失败,就分配到 Eden区
    2. 否则,在 TLAB外堆上的Eden区分配。
  4. 判断是否可以在 Eden中分配?
    1. 如果是,直接分配
    2. 否则,在 Eden区进行 GC 直到可以进行空间分配。

对象创建流程图(重要)

image