當虛擬機遇到new指令的時候
檢查铜犬、確認內存大小和分配內存、初始化內存空間
1.檢查指令的參數(shù)能否在常量池中定位到一個類的符合引用轻庆,并且檢查這個符號引用代表的類有沒有被加載癣猾、解析和初始化過
2.如果沒有,則執(zhí)行類加載過程
3類加載檢查通過后余爆,便可以確認對象所需的內存大小纷宇,如何進行分配內存
4.指針碰撞:可以理解為一邊是使用的內存一邊是空的,夾在中間的指針龙屉,分配內存的時候就是指針往空的內存挪一丟丟距離呐粘,即和對象所需內存大小一樣的內存空間。 高效簡單转捕!
5.空閑列表:就是內存不夠整齊作岖,坑坑洼洼的,得專門記錄哪塊內存可用五芝,分配時找到大的內存空間給對象痘儡。比較復雜!
6.如果是使用復制算法和標記壓縮法? 使用指針碰撞
? ?如果是使用標記清除算法枢步,則使用空閑列表
7.分到內存后要將分配到的內存空間都初始化為0沉删,不包含對象頭(不知道為什么,日后研究)
8.設置對象醉途,將一些信息存放到對象頭(哪個類的實例矾瑰,如何找到類的元數(shù)據(jù)信息,hash碼隘擎,GC分代年齡)殴穴。到這一步對象就產(chǎn)生了!
對象的內存布局
1.對象頭(兩部分)
Mark World:存放運行時數(shù)據(jù)(hashcoad货葬,GC分代年齡采幌,鎖的狀態(tài)標志,線程持有的鎖)
類型指針:對象指向它的類型元數(shù)據(jù)指針
2.實例數(shù)據(jù)
3.對齊填充:占位符作用
對象的訪問定位:通過棧的reference
1.句柄訪問:Java堆中專門劃分內存當作句柄池震桶,reference存儲的是對象的句柄地址
好處:儲存的是穩(wěn)定的句柄地址休傍,GC時候對象位置發(fā)生變化只需要修改句柄中的實例數(shù)據(jù)指針
2.直接指針訪問:referenc直接存儲的是對象地址,速度較快