1. 程式人生 > >Java虛擬機 學習 第二章總結

Java虛擬機 學習 第二章總結

windows 控制 常量池 永久代 導致 程序 兩個 內存模型 直接內存

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虛擬機 學習 第二章總結