JAVA物件記憶體逃逸技術
阿新 • • 發佈:2019-02-14
“棧的優勢是,存取速度比堆要快,僅次於暫存器,棧資料可以共享。但缺點是,存在棧中的資料大小與生存期必須是確定的,缺乏靈活性。棧中主要存放一些基本型別的變數(,int, short, long, byte, float, double, boolean, char)和物件控制代碼。 ”
可見,垃圾回收GC是針對堆Heap的,而棧因為本身是FILO - first in, last out. 先進後出,能夠自動釋放。 這樣就能明白到new建立的,都是放到堆Heap! 記憶體逃逸技術: 不在Heap Area分配物件,不需要GC來釋放物件。主要是在Stack中來分配,Stack中回收。 物件定義在方法體內部,又被外部引用使用,則為記憶體逃逸。
示例:
public class Test {
public static void main() {
Work worker = new Worker()
while (true) {
worker.useWorker();
}
}
}
class Worker {
public Worker worker;
public Worker getWorker() {
return null == worker?new Worker() : worker; //物件定義在方法體內部。
}
public void setWorker() {
worker = new Worker();
}
public void useWorker() {
Worker obj = getWorker();
}
public void useWorker2() {
Worker obj = getWorker(); //沒有被外部使用,不為記憶體逃逸
}
}