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堆中分配一塊內存,作為句柄池
對象的引用指向穩定的句柄,對象移動只需改變句柄中實例數據指針
句柄中有指向對象實例數據和對象類型數據的指針

②直接訪問
對象的引用直接指向對象實例數據
對象實例數據中有指向對象類型數據的指針
直接訪問開銷小

