逃逸分析原理:分析对象动态的作用域,当一个对象在方法中定义后,他可能被外部方法所引用
比如:调用参数传递到其他方法去,这种称之为方法逃逸。甚至还有可能被外部线程所访问,例如给其他线程中的访问的变量,这个称之为线程逃逸。从不逃逸到方法逃逸到线程逃逸,称之为对象由低到高的不同逃逸程序,如果确定一个对象不会逃逸出线程之外,那么 让对象在栈上分配内存可以提高JVM的效率
逃逸分析代码:
这段代码在调用的过程中 Myobject 这个对象属于不可以逃逸,JVM 可以做栈上分配,然后通过开启和关闭DoEscapeAnalysis 开关观察不同
开启逃逸分析(JVM 默认开启)

查看执行速度
关闭逃逸分析

查看执行速度
测试结果可见, 开启逃逸分析对代码的执行性能有很大的影响! 那为什么有这个影响?
逃逸分析
如果是逃逸分析出来的对象可以在栈上分配的话,那么该对象的生命周期就跟随线程了,就不需要垃圾回收了,如果是频繁的调用此方法则可以得到很大的性能提升。采用了逃逸分析后,满足逃逸的对象在栈上分配
没有开始逃逸分析对象就会在堆进行分配,会频繁触发GC进行垃圾回收,而每一次垃圾回收都会影响到系统性能,导致代码运行慢
代码验证
开启 GC 打印日志
-XX:+PrintGC
可以看到没有 GC 日志
关闭逃逸分析

可以看到关闭了逃逸分析,JVM 在频繁的进行GC垃圾回收,正是这一块的操作导致性能有较大的差别
最后修改于 2020-07-28 16:23:42
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

