Java 虚拟机逃逸分析

首先先说下为什么需要了解要逃逸分析,在哪里用到。     Java堆区是一块用于存储对象实例的内存区,同时也是gc执行垃圾回收的重点区域。所以这也造成gc可能会在大内存的使用和

频繁进行垃圾回收过程上成为系统性能瓶颈。为了解决这个问题,jvn设计者开始考虑把对象实例存储到Java堆区外。使用GCIH技术,即将生命周期长的Java对象从heap中移动到heap外,并且gc不能管理GCIH内部的对象。因此达到降低GC的回收频率和提升GC的回收效率的目的。   而另一种方法,就是逃逸分析了。它也是降低GC的回收频率和提升GC的回收效率的有效方式。

  逃逸分析(Escape Analysis)是目前Java虚拟机中比较前沿的优化技术。

逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他地方中,称为方法逃逸。

例如:

1 2 3 4 5 6 public static StringBuffer craeteStringBuffer(String s1, String s2) {          StringBuffer sb = new StringBuffer();          sb.append(s1);          sb.append(s2);          return sb;      }

StringBuffer sb是一个方法内部变量,上述代码中直接将sb返回,这样这个StringBuffer有可能被其他方法所改变,这样它的作用域就不只是在方法内部,虽然它是一个局部变量,称其逃逸到了方法外部。

甚至还有可能被外部线程访问到,譬如赋值给类变量或可以在其他线程中访问的实例变量,称为线程逃逸。

上述代码如果想要StringBuffer sb不逃出方法,可以这样写:

1 2 3 4 5 6 public static String createStringBuffer(String s1, String s2) {          StringBuffer sb = new StringBuffer();          sb.append(s1);          sb.append(s2);          return sb.toString();      }

不直接返回 StringBuffer,那么StringBuffer将不会逃逸出方法。

参考:http://www.importnew.com/23150.html




本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部