1. 程式人生 > >基於Hotspot和java堆為例的對象分析

基於Hotspot和java堆為例的對象分析

分配內存 虛擬機 cal read col 動作 java 分析 元數據

1.對象的創建

首先虛擬機遇到一條new指令時,將去檢查這個指令的參數是否能在常量池中定位到一個類的符號引用,並且檢查這個符號引用代表的類是否已被加載、解析和初始化過。如果沒有,那必須先執行相應的類加載過程。

在類加載檢查通過後,接下來虛擬機將為新生對象分配內存。對象所需內存的大小在類加載完成後便可完全確定,為對象分配空間的任務等同於把一塊確定大小的內存從java堆中劃分出來。

這裏介紹兩種分配方式:指針碰撞:假設java 堆內存是規整的,所有用過的內存放一邊,空閑的內存放另一邊,中間放著一個指針作為分界點的指示器,那麽分配內存大小就是僅僅把那個指針向空閑那邊挪動一段與對象大小想等的距離。

空閑列表:如果java堆內存不是規整的,就必須維護一個列表,記錄上哪些內存塊是可用的,在分配時候從列表中找到一塊足夠大的空間劃分給對象實例,並更新列表上的記錄。

除如何劃分可用空間之外,還有另外一個需要考慮的問題,對象創建是非常頻繁的行為,在並發情況下線程存在安全問題,

兩種解決方案:1.對分配內存空間的動作進行同步處理

2.吧內存分配的動作按照線程劃分在不同的空間之中進行,即每個線程在java堆中預先分配一小塊內存,稱為本地線程分配緩沖(Thread LOcal Allocation Buffer,TLAB)哪個線程要分配內存,就在哪個線程的TLAb上分配,只有TLAB用完並分配新的TLAB是,才需要同步鎖定。

接下來虛擬機要對對象進行必要的設置。例如這個對象是哪個類的實例、如何才能找到類的元數據信息、對象的哈戲碼、對象的GC分代年齡等信息。

接下來就是一些init初始化。

基於Hotspot和java堆為例的對象分析