Java: 逃逸分析

概述:

对象一般都是在堆上生成的,也不是绝对的,特例:逃逸分析。

JVM 在分析代码之后,发现一个对象在声明之后只有在当前运行的函数中调用,那么就会将这个对象在栈上申请空间,而不是在堆上。

这就是JDK6上的逃逸分析。

因为在栈上申请的对象函数执行完毕后直接清理,就大大减少了GC的压力。


demo:

Java: 逃逸分析 传入的value应当大于127或小于-128。

编辑运行的模式,设置堆的大小为10M,并设置打印GC的过程。

JDK6默认开了逃逸分析通过设置-XX:-DoEscapeAnalysis来关闭逃逸分析:

Java: 逃逸分析

设置为10M是为了尽快进入GC。

 Java: 逃逸分析

不断打印了GC的过程,空间又满了又进入GC。

这是因为new 对象会在堆上申请空间。所以会疯狂GC.

现在打开逃逸分析:

Java: 逃逸分析 Java: 逃逸分析

 几次GC后就不再GC了。这就是逃逸分析。

逃逸分析是分析了当前对象只在当前函数范围内使用,因而改为在栈上申请空间。栈是函数运行完就立刻清理的,不需要等到GC,缓解了GC的压力。

如果不是只在当前函数范围内用到的对象不行。