如何快速的判断是否发生了逃逸分析,就看new的对象有没有可能在方法外被引用。
如果经过逃逸分析后发现,一个对象并没有逃逸出方法的话,那么就可能被优化成栈上分配
栗子:
-XX:+DoEscapeAnalysis //开启逃逸分析
-XX:-DoEscapeAnalysis //不开启逃逸分析
1.未开启逃逸分析
package GC;/**
* @program: JVM
*
* @description:
*
* @author: Mr.Wang
*
* @create: 2021-06-17 13:48
**/
public class ClasssLoaderTest {
public static void main(String[] args) throws InterruptedException {
long start = System.currentTimeMillis();
for(int i = 0 ; i< 1000000000;i++){
alloc();
}
long end = System.currentTimeMillis();
System.out.println("没有开启GC的话花费"+(end-start));
Thread.sleep(1000000);
}
public static void alloc(){
ClasssLoaderTest c = new ClasssLoaderTest();
}
}
花费时间为
利用jvisualvm工具可以发现,发生了17次GC,花费19.800ms
2.开启逃逸分析的话
总共花费
打开visualvm工具发现,0次GC,花费0s
栈上分配后,继续在栈内执行,线程结束,栈空间被回收,局部变量对象也就被回收了,这样就不需要垃圾回收了,提高了性能,非常的方便。