1. 程式人生 > >Java學習之棧記憶體與堆記憶體

Java學習之棧記憶體與堆記憶體

堆:(物件)
引用型別的變數,其記憶體分配在堆上或者常量池(字串常量、基本資料型別常量),需要通過new等方式來建立。
堆記憶體主要作用是存放執行時建立(new)的物件。
(主要用於存放物件,存取速度慢,可以執行時動態分配記憶體,生存期不需要提前確定)

**棧:(基本資料型別變數、物件的引用變數)
基本資料型別的變數(int、short、long、byte、float、double、boolean、char等)以及物件的引用變數,其記憶體分配在棧上,變量出了作用域就會自動釋放。

棧記憶體的主要作用是存放基本資料型別和引用變數。棧的記憶體管理是通過棧的”後進先出”模式來實現的。

(主要用來執行程式,存取速度快,大小和生存期必須確定,缺乏靈活性)

棧記憶體中儲存引用變數p,堆記憶體存放new的物件

當一個方法執行時,每個方法都會建立自己的記憶體棧,在這個方法定義的變數將會放到這塊棧記憶體裡,隨著方法的結束,這個方法的記憶體棧也將自動銷燬。(不需要GC回收)

因此,所有在方法中定義的區域性變數放在棧記憶體中;

當我們在程式中建立一個物件時,這個物件會被儲存到執行時資料區中,以便反覆利用(複用,因為建立物件的成本通常較大),這個執行時資料區就是堆記憶體。堆記憶體中的物件不會隨著方法的結束而銷燬,即使方法結束後,這個物件還可能被另外一個引用變數所引用(在方法的引數傳遞時很常見),則這個物件依然不會被銷燬。只有當一個物件沒有任何引用變數去引用它時,系統的垃圾回收器(GC)才會在合適的時候回收它。