首先先说下为什么需要了解要逃逸分析,在哪里用到。Java堆区是一块用于存储对象实例的内存区,同时也是gc执行垃圾回收的重点区域。所以这也造成gc可能会在大内存的使用和频繁进行垃圾回收过程上成为系统性能瓶颈。为了解决这个问题,jvn设计者开始考虑把对象实例存储到Java堆区外。使用GCIH技术,即将生命周期长的Java对象从heap中移动到heap外,并且gc不能管理GCIH内部的对象。因此达到降低GC的回收频率和提升GC的回收效率的目的。 而另一种方法,就是逃逸分析了。它也是降低GC的回收频率和提升GC的回收效率的有效方式。 逃逸分析(Escape Analysis)是目前Java虚拟机中比较前沿的优化技术。 逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他地方中,称为方法逃逸。
例如:
Java 虚拟机逃逸分析
StringBuffer sb是一个方法内部变量,上述代码中直接将sb返回,这样这个StringBuffer有可能被其他方法所改变,这样它的作用域就不只是在方法内部,虽然它是一个局部变量,称其逃逸到了方法外部。甚至还有可能被外部线程访问到,譬如赋值给类变量或可以在其他线程中访问的实例变量,称为线程逃逸。上述代码如果想要StringBuffer sb不逃出方法,可以这样写
Java 虚拟机逃逸分析
不直接返回 StringBuffer,那么StringBuffer将不会逃逸出方法。本文转至——明辰智航
明辰智航
领取专属 10元无门槛券
私享最新 技术干货