方法逃逸
Posted Mr. Yang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了方法逃逸相关的知识,希望对你有一定的参考价值。
逃逸的基本行为是分析对象的动态作用域,分析指针动态范围的方法称之为逃逸分析 当变量(或者对象)在方法中分配后,其指针有可能被返回或者被全局引用,这样就会被其他过程或者线程所引用,这种现象称作指针(或者引用)的逃逸(Escape)。
逃逸分为方法逃逸线程逃逸
- class A {
- public static B b;
- public void globalVariablePointerEscape() { // 给全局变量赋值,发生逃逸
- b = new B();
- }
- public B methodPointerEscape() { // 方法返回值,发生逃逸
- return new B();
- }
- public void instancePassPointerEscape() {
- methodPointerEscape().printClassName(this); // 实例引用传递,发生逃逸
- }
- }
- class B {
- public void printClassName(A a) {
- System.out.println(a.class.getName());
- }
- } 不存在逃逸,则可以对这个变量进行优化
1,栈上分配。
在一般应用中,不会逃逸的局部对象占比很大,如果使用栈上分配,那大量对象会随着方法结束而自动销毁,垃圾回收系统压力就小很多。
2,同步消除
线程同步本身比较耗时,如果确定一个变量不会逃逸出线程,无法被其它线程访问到,那这个变量的读写就不会存在竞争,对这个变量的同步措施
可以清除。
3,标量替换。
1, 标量就是不可分割的量,java中基本数据类型,reference类型都是标量。相对的一个数据可以继续分解,它就是聚合量(aggregate)。
2, 如果把一个对象拆散,将其成员变量恢复到基本类型来访问就叫做标量替换。
3, 如果逃逸分析证明一个对象不会被外部访问,并且这个对象可以被拆散的话,那么程序真正执行的时候将可能不创建这个对象,而改为直接在>栈上创建若干个成员变量。
相关JVM参数
-XX:+DoEscapeAnalysis 开启逃逸分析
-XX:+PrintEscapeAnalysis 开启逃逸分析后,可通过此参数查看分析结果。
-XX:+EliminateAllocations 开启标量替换
-XX:+EliminateLocks 开启同步消除
-XX:+PrintEliminateAllocations 开启标量替换后,查看标量替换情况
以上是关于方法逃逸的主要内容,如果未能解决你的问题,请参考以下文章