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://blog.csdn.net/ghost_Programmer/article/details/40891735