1. 遇到new指令時(shí)践盼,檢查常量池,檢查是否被加載宾巍,解析及初始化咕幻,沒有則執(zhí)行類加載過程。
2. 類加載檢查通過后顶霞,分配內(nèi)存地址肄程,分配方式分為指針碰撞(內(nèi)存規(guī)整,一個(gè)接一個(gè))跟空閑列表(維護(hù)可用地址)选浑,是否規(guī)整則根據(jù)垃圾回收機(jī)制進(jìn)行確定蓝厌,標(biāo)記清除顯然屬于空閑列表,能進(jìn)行內(nèi)存重置的則是指針碰撞
3. 如何解決并發(fā)問題古徒?
? ? 方案一:同步處理拓提。通過CAS(內(nèi)存值,舊值的預(yù)期值隧膘,要改的值代态,版本戳)加上失敗重試的機(jī)制保證原子性寺惫。
? ? 方案二:把分配內(nèi)存的動(dòng)作根據(jù)不同線程劃分在預(yù)分配的空間中進(jìn)行,分配空間用完之后蹦疑,進(jìn)行同步鎖定西雀,這塊內(nèi)存被稱為TLAB(Thread Local Allocation Buffer 本地線程分配緩存),虛擬機(jī)是否使用歉摧,采用-XX:+/-UseTLAB 指定
4. 分配內(nèi)存空間之后艇肴,將分配到的內(nèi)存空間初始化零值,如果是TLAB模式叁温,可以在預(yù)分配的時(shí)候初始化再悼,這個(gè)步驟的目的是保證對(duì)象可以不賦值即可使用,程序訪問到零值
5. 設(shè)置對(duì)象基本信息券盅。將對(duì)象是那個(gè)類的實(shí)例帮哈,如何找到元信息膛檀,對(duì)象的哈希碼锰镀,對(duì)象的GC分代年齡信息等放置到對(duì)象的頭部信息(Object Header)中,對(duì)象頭后面會(huì)進(jìn)一步闡述咖刃。
6. 虛擬機(jī)的創(chuàng)建完成泳炉,程序進(jìn)行對(duì)象初始化并賦值。