逃逸分析原理:分析对象动态的作用域,当一个对象在方法中定义后,他可能被外部方法所引用

      比如:调用参数传递到其他方法去,这种称之为方法逃逸。甚至还有可能被外部线程所访问,例如给其他线程中的访问的变量,这个称之为线程逃逸。从不逃逸到方法逃逸到线程逃逸,称之为对象由低到高的不同逃逸程序,如果确定一个对象不会逃逸出线程之外,那么 让对象在栈上分配内存可以提高JVM的效率

逃逸分析代码:

这段代码在调用的过程中 Myobject 这个对象属于不可以逃逸,JVM 可以做栈上分配,然后通过开启和关闭DoEscapeAnalysis 开关观察不同

开启逃逸分析(JVM 默认开启)

查看执行速度

关闭逃逸分析

查看执行速度

测试结果可见, 开启逃逸分析对代码的执行性能有很大的影响! 那为什么有这个影响?
 

逃逸分析

如果是逃逸分析出来的对象可以在栈上分配的话,那么该对象的生命周期就跟随线程了,就不需要垃圾回收了,如果是频繁的调用此方法则可以得到很大的性能提升。采用了逃逸分析后,满足逃逸的对象在栈上分配

没有开始逃逸分析对象就会在堆进行分配,会频繁触发GC进行垃圾回收,而每一次垃圾回收都会影响到系统性能,导致代码运行慢

代码验证


开启 GC 打印日志


-XX:+PrintGC

可以看到没有 GC 日志


关闭逃逸分析

可以看到关闭了逃逸分析,JVM 在频繁的进行GC垃圾回收,正是这一块的操作导致性能有较大的差别

 

 

最后修改于 2020-07-28 16:23:42
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付
上一篇