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