JVM堆内存分配与逃逸分析
请解释JVM的逃逸分析、栈上分配和标量替换优化,以及对象是否一定分配在堆上?
回答
苦行僧
逃逸分析(Escape Analysis):
- JIT编译器分析对象的作用域,判断对象是否逃逸出方法或线程。
- 开启:
-XX:+DoEscapeAnalysis(JDK6u23+默认开启)。
基于逃逸分析的优化:
- 栈上分配(Stack Allocation):未逃逸对象分配在栈帧中,方法结束自动销毁,减少GC压力。
- 标量替换(Scalar Replacement):将对象拆解为基本类型(标量),直接在栈上分配成员变量。
- 同步消除(Lock Elimination):检测锁仅在单线程中使用时消除同步。
结论:
- 对象不一定都在堆上分配。
- 满足逃逸分析条件的对象可以在栈上分配。
- 但绝大多数对象仍然在堆上分配。
- 开启逃逸分析可显著降低Minor GC频率。