JVM 对象分配过程
对象分配过程 1)依据逃逸分析,判断是否能栈上分配? 如果可以,使用标量替换方式,把对象分配到 VM Stack 中。如果 线程销毁或方法调用结束后,自动销毁,不需要 GC 回收器 介入。 否则,继续下一步。 2)判断是否大对象? 如果是,直接分配到堆上 Old Generation 老年代上。如果对象变为垃圾后,由老年代GC 收集器(比如 Parallel Old, CMS, G1)回收。 否则,继续下一步。 3)判断是否可以在 TLAB 中分配? 如果是,在 TLAB 中分配堆上 Eden 区。 否则,在 TLAB 外堆上的 Eden 区分配。 栈上分配 本质上是JVM提供的一个优化技术。 基本思想:将线程私有的对象打散分配在栈 VM Stack 上 优点: 可以在函数调用结束后自行销毁对象,不需要垃圾回收器的介入,有效避免垃圾回收带来的负面影响 栈上分配速度快,提高系统性能 局限性: 栈空间小,对于 大对象 无法实现栈上分配 技术基础: 逃逸分析 、 标量替换 什么是逃逸分析? 关于 Java 逃逸分析的定义: 逃逸分析(Escape Analysis)简单来讲就是,Java Hotspot 虚拟机可以分析新创建对象的使用范围,并决定是否在 Java 堆上分配内存的一项技术。 逃逸分析的 JVM 参数如下: 开启逃逸分析: -XX:+DoEscapeAnalysis