1. 程式人生 > >JAVA物件記憶體逃逸技術

JAVA物件記憶體逃逸技術

“棧的優勢是,存取速度比堆要快,僅次於暫存器,棧資料可以共享。但缺點是,存在棧中的資料大小與生存期必須是確定的,缺乏靈活性。棧中主要存放一些基本型別的變數(,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(); //沒有被外部使用,不為記憶體逃逸

  }

}