Java中堆區 | 棧區 | 方法區


JVM虛擬機

寄存器:

  最快的存儲區,位於處理器內部,但是數量極其有限。所以寄存器根據需求進行自動分配,無法直接人為控制

堆區:

位於RAM當中,一種通用的內存池。其中存放的數據由JVM自動進行管理。

  jvm只有一個堆區(heap)被所有線程共享,只存放對象本身

  又稱動態內存分配,當需要一個對象時,使用new寫一行代碼,當執行這行代碼時,會自動在堆里進行存儲分配。

  使用完畢之后,會在垃圾回收器空閑的時候盡心那個回收。

棧區:

位於RAM當中,通過堆棧指針可以從處理器獲得直接支持。堆棧指針向下移動,則分配新的內存;向上移動,則釋放那些內存。這種存儲方式速度僅次於寄存器。

  用於存放對象引用和基本數據類型(注意沒有String)

  當方法被執行時,方法體內的局部變量(其中包括基礎數據類型、對象的引用)都在棧上創建。

  因為棧內存分配運算內置於處理器的指令集中,效率很高,但是分配的內存容量有限。

  使用完畢,立即回收。

靜態存儲區(方法區):

  主要存放靜態數據、全局 static 數據和常量。這塊內存在程序編譯時就已經分配好,並且在程序整個運行期間都存在。

 

棧與堆的區別:

  存儲數據類型:棧區存儲基本數據變量(注意不包括String)和引用數據變量(通過new關鍵字創建的),堆內存用來存放所有由 new 創建的對象(包括該對象其中的所有成員變量)和數組

  可以在棧中定義一個特殊的變量,這個變量的取值等於數組或者對象在堆內存中的首地址,這個特殊的變量就是我們上面說的引用變量。我們可以通過這個引用變量來訪問堆中的對象或者數組。

  存儲速度:就存儲速度而言,棧內存的存儲分配與清理速度更快於堆,並且棧內存的存儲速度僅次於直接位於處理器當中的寄存器。

  靈活性:就靈活性而言,由於棧內存與堆內存存儲機制的不同,堆內存靈活性更優於棧內存。靈活性:就靈活性而言,由於棧內存與堆內存存儲機制的不同,堆內存靈活性更優於棧內存。

Eg:

public class Test {
    public static int a1=0;
    public static void Demo(){
        int a2=1;
        Test test2=new Test();
    }
}

變量a1和方法Demo()存放在方法區

變量a2和對象的引用 test2存放在棧區

而通過new Test()創建的對象將存放在堆區

 

局部變量的基本數據類型和引用存儲於棧中,引用的對象實體存儲於堆中。—— 因為它們屬於方法中的變量,生命周期隨方法而結束。

成員變量全部存儲與堆中(包括基本數據類型,引用和引用的對象實體)—— 因為它們屬於類,類對象終究是要被new出來使用的。

 

參考文章【建議參考原文】:

https://github.com/francistao/LearningNotes/blob/master/Part1/Android/Android%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F%E6%80%BB%E7%BB%93.md

https://blog.csdn.net/ghost_Programmer/article/details/40891735

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM