標籤:虛擬 ring 符號 記憶體 windows64 記憶體管理 str 變化 靜態
Java的記憶體管理機制
JVM運行時的資料區域:程式計數器,Java虛擬機器棧,本地方法棧,Java堆,方法區,運行時常量池,(直接記憶體)
按照線程共用分類:線程專屬
1.程式計數器,佔用非常小的空間,用於維護線程切換時執行過程的正確性
2.Java虛擬機器棧:Java線程沒執行一個方法都會產生一個棧幀,用於儲存局部變數表、運算元棧、動態連結、方法出口等資訊,而棧幀就儲存在Java虛擬機器棧中。使用-Xss 來控制棧的大小。有兩種情況會導致虛擬機器棧報錯:a.棧幀的數量過多,報錯SOF!例如無限遞迴(windows64位我測出來是 6w+報錯);b.沒建立一個線程都會為他分配一個虛擬機器棧,如果新建立線程時,無法分配新的虛擬機器棧則報OOM;
3.本地方法棧:和Java虛擬機器棧沒有什麼區別,只不過面向本地Native方法。(Sun Hotspot是將兩個棧合并在一起了)
按照線程共用分類:線程共用
1.Java堆:規範描述,所有的對象執行個體和數組都要在堆上分配。現在流行可擴充大小,使用-Xmx 和-Xms 進行控制,無法再擴充時,就會拋出OOM異常
2.方法區:儲存已經被虛擬機器載入的類資訊、常量、靜態變數、即時編譯後的代碼資料。用-XX:MaxPermSize進行大小控制,當無法滿足記憶體配置是時拋出OOM。(關於-XX:PermSize使用,我在Java8上測試,提示-XX:MaxPermSize無效的,需要研究,查看資料,發現Java8中的永久代沒有啦,使用什麼元空間。需要學習Java7-Java8的記憶體模型的變化)
3.運行時常量池:是方法區的一部分,用於儲存各種字面變數和符號應用。比如較小的int、調用String的intern()方法。
直接記憶體:並不在JVM規範裡面,不過會被頻繁的使用,使用-Xmx進行大小控制,如果沒有足夠的空間則拋出OOM
Java虛擬機器 學習 第二章總結