1. 程式人生 > >《Java虛擬機》隨筆記01

《Java虛擬機》隨筆記01

普通 內容 java虛擬機 空間 reference 虛擬 有效 私有 這一

一、運行時數據區
1.計數器
當前線程所執行的字節碼的行號指示器
2.虛擬機棧
線程私有 每個方法在執行時會創建一個棧幀,
3.本地方法棧
4.java堆
所有線程共享的一塊內存區域,所有對象實例和數組都在堆上分配內存。
-Xmx -Xms
5.方法區
線程共享,存儲被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼
方法區無法滿足內存分配需求,內存泄露OutOfMemoryError
5.1運行時常量池
運行時常量池具備動態性,運行期間也可將新的常量放入池中
HotSpot虛擬機
永久代 -XX:MaxPermSize

二、HotSpot虛擬機在java堆中對象分配、布局和訪問的全過程
本地線程分配緩沖(Thread Local Allocation Buffer)
虛擬機是否使用TLAB -XX:+/-UseTLAB
2.1對象創建
new指令,類加載-->為新生對象分配內存,對象所需大小在類加載完後可確定。-->將分配到的內存空間都初始化為零值-->對對象進行必要的設置(類的元數據信息、對象的哈希碼、對象的gc分代年齡,這些信息存放在對象的對象頭中Object Header)-->init方法
內存分配完成後,虛擬機需要將分配到的內存空間初始化為零值。這一步操作保證了對象的實例對象在java代碼總可以不賦值就
直接使用,程序能訪問到這些字段的數據類型所對應的零值。
2.2對象的內存布局
對象在內存中存儲布局分為:對象頭、實例數據、對齊填充
對象頭:第一部分:存儲對象自身的運行時數據,如哈希碼、GC分代年齡、鎖狀態標誌、線程持有的鎖、偏向線程ID、偏向時間戳。
另一部分是類型指針,即對象指向它的類元數據的指針。
實例數據:對象真正存儲的有效信息,在程序代碼中所定義的各種類型的字段內容。存儲順序受到虛擬機分配策略參數和字段在java源碼中定義順序的影響。HotSpot虛擬機默認 的分配策略為long/doubles、ints、shorts/chars、bytes/booleans、oops(Ordinary Object Points)普通對象指針。
對齊填充:起著占位符的作用。HotSpot VM自動內存管理系統要求對象起始地址是8字節的整數倍,即對象的大小必須是8字節的整數倍。而對象頭大小是8字節的倍數。當對象實例數據部分沒有對齊時,就需要對齊填充來補全。
2.3訪問定位
java虛擬機棧中的reference類型存放對象的引用。訪問具體對象目前有2種方式。句柄和直接指針。
若采用句柄訪問,則reference中存儲的是句柄池的地址,句柄中包含了對象實例數據與類型數據各自的具體地址信息。
若采用直接指針訪問,則reference中存儲的是對象的地址。(是對象類型數據的還是對象實例數據的?)

《Java虛擬機》隨筆記01