本文主要是介绍逃逸分析学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
逃逸分析:一种确定指针动态范围的静态分析,它可以分析程序在哪些地方访问到指针。
场景一:
对象被复制给成员变量或静态变量,可能被外部使用,此时变量就发生了逃逸。
场景二:
对象通过return语句返回。如果对象通过return语句返回了,此时的程序并不能确定这个对象会不会被使用,外部的线程可以访问到这个变量,此时对象也发生了逃逸。
逃逸分析优点:
- 对象栈上分析
- JVM通过逃逸分析,分析出新对象的使用范围,就可能将对象在栈上进行分配。栈分配可以快速地在栈帧上创建和销毁对象,不用再将对象分配到堆空间,可以有效的减少JVM垃圾回收的压力。
- 分离对象/标量替换
- 当JVM通过逃逸分析,确定要将对象分配到栈上时,即时编译可以将对象打散,将对象替换为一个个很小的局部变量,我们将这个打散的过程叫做标量替换。将对象替换为一个个局部变量后,就可以非常方便的栈上进行分配了。
- 消除同步锁
- 如果JVM通过逃逸分析,发现一个对象只会被一个线程访问,则访问这个对象时,可以不加同步锁。如果程序中使用了synchronized锁,则JVM会将synchronized说消除。
- 这种情况针对的是synchronized锁,而对于Lock锁,JVM不能消除。
- 并不是所有的对象和数组,都是在堆上进行分配的,由于即时编译的存在,如果JVM发现某些对象没有逃逸出去,就有可能被优化成在栈上分配。
这篇关于逃逸分析学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!