1. 程式人生 > >深入理解Java虛擬機(筆記)

深入理解Java虛擬機(筆記)

包括 指針 思想 創建 區域 算法; 很多 由於 線程安全

內存分配:

  為對象分配內存有兩種方式,第一種是“指針碰撞”,也就是把內存分為兩邊,一邊是已使用區域,另一邊是未分配區域,分界線用指針記錄,當要分配內存時,只需把指針向未分配區域移動需要的空間即可,通常compact算法的垃圾回收會使用“指針碰撞”,如Serial、ParNew;另一種是空閑列表記錄,也就是分配是可以不連續的,中間很多間隔可用的未分配內存,這個時候需要一個列表來對內存進行記錄,分配內存時候就在列表找到最合適的,通常這種分配方式對應的垃圾回收器如CMS這種基於Mark-Sweep算法;

  由於分配內存也是多線程,存在內存使用資源的競爭,因此要保證線程安全,解決這個問題有兩種方案,第一種是利用CAS加上失敗重試方法保持原子性;第二種是用到ThreadLocal思想,就是為每一個線程分配一個線程自己的空間,稱為Thread Local Allocation Buffer,TLAB,當線程完成逃逸分析後就把對象分配到該區域內。最後,當線程分配完後虛擬機就馬上為分配到的空間初始化為零值,不包括對象頭。

對象頭(Header):

  對象可以分為三部分,對象頭、實例數據、對齊填充;

  對象頭包括兩種信息,第一是運行時數據(Mark Word),第二是類型指針(用作指定該對象是哪個類創建的,但也不一定就這樣實現);運行時數據包括:哈希嗎、GC分代年齡、鎖狀態標誌、線程持有的鎖、偏向鎖ID、偏向時間戳等等。如果該對象是數組,那麽還會對象頭還會繼續數組大小的數據。

  然後就是真正的實例數據了,實例數據包括父類繼承下來的和子類擁有的,會優先安排父類的字段排序在前面,同時會根據基本類型的大小,把大小相同的放到一起分配。最後的數據對齊就是簡單的填充作用。

、、、、、待續

深入理解Java虛擬機(筆記)