码迷,mamicode.com
首页 > 编程语言 > 详细

jvm的逃逸算法

时间:2019-01-12 18:04:12      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:ntc   赋值   this   堆内存   epo   执行   lob   分析   blog   

参考:https://www.cnblogs.com/gnivor/p/6028001.html

Java的对象时分配在堆内存里面的,把引用放在栈中,每次GC回收的时候,遍历引用树,回收相应的对象,如果对象比较比较多,那么压力比较大,所以就想减少在堆内存中分配的对象。

分析找到未逃逸的变量,将变量类的实例化内存直接在栈里分配(无需进入堆),分配完成后,继续在调用栈内执行,最后线程结束,栈空间被回收,局部变量对象也被回收。

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());
  }
}

当一个对象子方法体里面,没有把句柄传给全局变量,且也没有返回,也没有实例传递。

没有发生逃逸的对象由于生命周期都在一个方法体内,因此它们是可以在运行时栈上分配并销毁。

逃逸分析另一个重要的优化 - 同步消除

如果你定义的类的方法上有同步锁,但在运行时,却只有一个线程在访问,此时逃逸分析后的机器码,会去掉同步锁运行。

 

jvm的逃逸算法

标签:ntc   赋值   this   堆内存   epo   执行   lob   分析   blog   

原文地址:https://www.cnblogs.com/lvcongblog/p/10260190.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!