天天看點

《深入了解java虛拟機》讀書筆記1--java記憶體區域Java記憶體管理

Java記憶體管理

本文主要介紹Java虛拟機運作時的記憶體區域是如何劃分的、Java對象的建立過程、Java對象的記憶體布局、Java對象的通路定位

一:運作時區域劃分

主要可以分為以下 幾個:

  程式計數器;

  棧(虛拟機棧和本地方法棧);

  堆;

  方法區;

1.程式計數器

  記錄正在執行的虛拟機位元組碼指令的位址.唯一一個沒有規定任何OutOfMemoryError的區域。

2.棧

  棧主要用來存儲局部變量表(各種局部變量(方法中的變量),基本類型和對象引用類型)、操作數棧、動态連結等資訊。線程私有的。是以方法中的變量不是線程共享資料。

  虛拟機棧和本地方法棧比較相似,他們的差別是虛拟機棧為虛拟機執行Java方法服務,本地方法棧為虛拟機使用到的native方法服務。

3.堆

  堆是Java虛拟機管理的記憶體最大的一塊。虛拟機啟動時建立,用于存放所有的對象執行個體以及數組。各個線程共享,是以,對象資料是共享資料。

4.方法區

  各個線程共享區域。存儲已被虛拟機加載的類資訊、常量、靜态變量等。這些資料都是共享資料

二:對象建立

類加載->配置設定記憶體->初始化為0->設定-><init>

類加載:第七章

記憶體配置設定:指針碰撞和空閑清單

  指針碰撞:當堆中記憶體是絕對規整的,用此方法。此記憶體可以看做兩部分,一邊是使用過的記憶體,另一邊是空閑的記憶體,中間用一個指針隔開。配置設定記憶體時,隻需将指針向空閑記憶體那邊移動一段與對象大小相等的距離即可。

  空閑清單:當堆中記憶體不是規整時用此方法。虛拟機必須維護一個清單,該表記錄了哪些記憶體塊是可用的,在配置設定的時候找到一塊足夠大的區域配置設定,并更新表上的記錄即可。

設定:對象頭的資訊進行設定。

<init>:按照程式員的意願進行初始化。

三:對象的記憶體布局 

對象的記憶體布局可以分為三塊區域:對象頭、執行個體資料和對齊填充。

對象頭:主要包含兩部分資訊:1,用于存儲對象自身運作時資料,如哈希碼、GC分代年齡、線程持有的鎖、鎖狀态标志等;2,類型指針,即對象指向它的類中繼資料的指針,虛拟機通過這個指針來确定這個對象是哪個類的執行個體;3,如果對象是數組,對象頭還要有數組長度。

執行個體資料:對象真正存儲的有效資訊,代碼中定義的各種字段,包括父類的。

對齊填充:充當占位符。對象的大小必須是8位元組的整數倍,對象頭正好是8位元組的整數倍。

四:對象的通路定位

Java程式需要通過棧上的對象引用資料來操作堆上的具體對象。有兩種通路方式:使用句柄和直接指針。

使用句柄:在Java堆中劃分一個區域來作為句柄池,reference中存儲的就是對象的句柄位址,而句柄中包含了對象執行個體資料和對象類型資料(類資料)的位址資訊。如圖:

《深入了解java虛拟機》讀書筆記1--java記憶體區域Java記憶體管理

直接指針通路:reference中存儲的直接就是對象的位址,而堆對象中就必須考慮 如何通路類型資料的相關資訊.

《深入了解java虛拟機》讀書筆記1--java記憶體區域Java記憶體管理

轉載于:https://www.cnblogs.com/xiaolovewei/p/8022194.html