![](https://i-blog.csdnimg.cn/blog_migrate/03b83e272c78895cee6186e136ea543a.jpeg)
Java Escape Analysis 是在 Java 程序编译过程中使用的一个过程,用于确定哪些对象可以分配到栈上而不是堆上。
目的&作用:
它有助于通过减少运行时分配的内存量并因此减少垃圾回收量来提高程序的性能。
也有助于消除不必要的加锁&同步操作
具体来说,Java程序在编译时,编译器会做Escape Analysis,判断哪些对象可以分配到栈上,而不是堆上。
怎么做的呢?
这是通过检查程序代码,以确定哪些对象仅在单个方法中引用,于是可以在栈里面去分配来完成的。此过程称为“栈分配(stack allocation)”
为了确定可以在栈上分配哪些对象,编译器将分析程序代码,以查找在方法外部,是否有目标对象的引用。
如果没有的话,如下所示,将在栈上分配
![](https://i-blog.csdnimg.cn/blog_migrate/48556a8c7d03fbe02bb86b505a1bcc58.png)
如果一个目标对象在方法体之外被引用,那么它就不能在栈上分配,而必须在堆上分配。
这意味着在多个方法中引用的对象,或在方法外部引用的对象将不符合堆栈分配的条件,如下所示
![](https://i-blog.csdnimg.cn/blog_migrate/f63d3205098786300aedccb6831fd76f.png)
综上所述,Java Escape Analysis 是在 Java 程序的编译过程中用来确定哪些对象可以分配到栈上而不是堆上的过程。 这有助于通过减少运行时分配的内存量和垃圾收集量来提高程序的性能。 同时。因为在栈而不是堆上分配对象,那么对象就是封闭在一个线程内,不与其他线程共享,从而在高并发的程序中消除了对象加解锁同步带来的性能消耗。