Java對象的創建、內存分配和訪問


Student student = new Student();

student.study();

(1)對象的創建

①檢查new指令的參數是否能在常量池中定位到一個類的符號引用,檢查符號引用代表的類是否已經加載、解析和初始化

  類的加載機制

②虛擬機為新生對象分配內存,對象所需內存的大小在類加載之后即可確定(從Java堆中分配一塊內存)

  指針碰撞:堆內存是規整的,用過的內存放一邊,空閑內存放另一邊,中間放一個指針作為分界點,分配時,只需要移動指針即可

  空閑列表:堆內存是不規整的,虛擬機維護一個列表,記錄那些內存是可用的,哪些內存是不可用的,分配時,從列表中找一塊足夠大的內存,並更新列表

    堆內存是否規整,取決於JVM采用的垃圾回收器是否有壓縮整理功能

  多線程環境下,內存分配是否線程安全(雖然只是修改一個指針)?

    a.對分配內存的動作進行同步處理(CAS+失敗重試)

    b.為每個線程分配一個本地線程緩沖區(TLAB)

③將分配到的內存空間初始化為零值

④設置對象的對象頭

  對象是那個類的實例、如何找到對象的雲數據、對象的哈希碼、對象的GC分代年齡

⑤執行<init>方法,按照程序員的意願進行初始化

(2)對象的內存布局

①對象頭

a.運行時數據:哈希碼、GC分代年齡、鎖狀態標志、線程持有的鎖等

d.類型指針,對象指向它的類元數據的指針,表明這個對象是哪個類的實例

②實例數據

程序中定義的字段(包括從父類繼承的)

存儲順序:虛擬機分配策略(long/double , int , short/char , byte , boolean, 引用)、定義的順序(父類在子類之前)

③對齊填充

(3)對象的訪問定位

對象實例數據&對象類型數據

①使用句柄訪問

Java堆中分配一塊內存,作為句柄池

對象的引用指向穩定的句柄,對象移動只需改變句柄中實例數據指針

句柄中有指向對象實例數據和對象類型數據的指針

 

②直接訪問

對象的引用直接指向對象實例數據

對象實例數據中有指向對象類型數據的指針

直接訪問開銷小

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM