深入理解JVM學習筆記(三十、JVM 記憶體分配----逃逸分析與棧上分配)
阿新 • • 發佈:2019-02-07
一、概念
我們之前提到過,JVM堆已經不是物件記憶體分配的唯一選擇。
棧上分配就是java虛擬機器提供的一種優化技術,基本思想是對於那些執行緒私有的物件(指的是不可能被其他執行緒訪問的物件),可以將它們打散分配在棧上,而不是分配在堆上。分配在棧上的好處是可以在函式呼叫結束後自行銷燬,而不需要垃圾回收器的介入,從而提供系統的效能。
棧上分配的一個技術基礎是進行逃逸分析。逃逸分析的目的是判斷物件的作用域是否有可能逃逸出函式體,只有在方法體內有效的物件才認為物件沒有發生逃逸,反之則認為物件發生了逃逸。
二、發生逃逸情況(程式碼示例)
package com.zjt.test.jvm009; public class Main { public Main m; /** * 方法返回物件例項,說明物件m發生了逃逸 * @return */ public Main getInstance() { return null == m ? new Main() : m ; } /** * 為成員屬性賦值,物件m發生逃逸 */ public void setM() { this.m = new Main(); } /** * 方法體內的物件m1作用域僅在當前方法體有效,因此m1未發生逃逸. */ public void useM(){ Main m1 = new Main(); } /** * 方法體內的物件m2引用成員變數的值,因此m2也發生了逃逸. */ public void useM2(){ Main m2 = getInstance(); } }