逃逸分析
用来确认对象是否被引用,如果不会逃逸(就是没有被引用),可以将该对象在栈上进行分配内存,让对象所在内存随着栈帧出栈而销毁,减轻垃圾回收的压力,减少临时对象在堆上分配内存。
例如:
开启逃逸分析参数-XX:+DoEscapeAnalysis,JDK7后默认开启逃逸分析,关闭把+改成-
使用标量替换优先分配在栈上。
标量替换
通过逃逸分析确认对象不会逃逸后 ,将对象进一步分解成多个标量,将这些标量分配到栈上或者寄存器上分配内存空间,这样不会因为没有一大块连续空间导致对象内存不够分配。
开启标量替换参数(-XX:+EliminateAllocations),JDK7默认开启。
标量与聚合量:
标量即不可被进一步分解的量,而JAVA的基本数据类型就是标量(如:int,long等基本数据类型以及 reference类型等),标量的对立就是可以被进一步分解的量,而这种量称之为聚合量。而在JAVA中对象就是可以被进一 步分解的聚合量。
结论:栈上分配依赖于逃逸分析和标量替换