JVM中new一個對象

當(dāng)虛擬機(jī)遇到new指令的時候

檢查、確認(rèn)內(nèi)存大小和分配內(nèi)存、初始化內(nèi)存空間

1.檢查指令的參數(shù)能否在常量池中定位到一個類的符合引用,并且檢查這個符號引用代表的類有沒有被加載、解析和初始化過

2.如果沒有,則執(zhí)行類加載過程

3類加載檢查通過后,便可以確認(rèn)對象所需的內(nèi)存大小,如何進(jìn)行分配內(nèi)存

4.指針碰撞:可以理解為一邊是使用的內(nèi)存一邊是空的,夾在中間的指針,分配內(nèi)存的時候就是指針往空的內(nèi)存挪一丟丟距離,即和對象所需內(nèi)存大小一樣的內(nèi)存空間。 高效簡單!

5.空閑列表:就是內(nèi)存不夠整齊,坑坑洼洼的,得專門記錄哪塊內(nèi)存可用,分配時找到大的內(nèi)存空間給對象。比較復(fù)雜!

6.如果是使用復(fù)制算法和標(biāo)記壓縮法? 使用指針碰撞

? ?如果是使用標(biāo)記清除算法,則使用空閑列表

7.分到內(nèi)存后要將分配到的內(nèi)存空間都初始化為0,不包含對象頭(不知道為什么,日后研究)

8.設(shè)置對象,將一些信息存放到對象頭(哪個類的實例,如何找到類的元數(shù)據(jù)信息,hash碼,GC分代年齡)。到這一步對象就產(chǎn)生了!


對象的內(nèi)存布局

1.對象頭(兩部分)

Mark World:存放運行時數(shù)據(jù)(hashcoad,GC分代年齡,鎖的狀態(tài)標(biāo)志,線程持有的鎖)

類型指針:對象指向它的類型元數(shù)據(jù)指針

2.實例數(shù)據(jù)

3.對齊填充:占位符作用


對象的訪問定位:通過棧的reference

1.句柄訪問:Java堆中專門劃分內(nèi)存當(dāng)作句柄池,reference存儲的是對象的句柄地址

好處:儲存的是穩(wěn)定的句柄地址,GC時候?qū)ο笪恢冒l(fā)生變化只需要修改句柄中的實例數(shù)據(jù)指針

2.直接指針訪問:referenc直接存儲的是對象地址,速度較快


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 介紹JVM中7個區(qū)域,然后把每個區(qū)域可能造成內(nèi)存的溢出的情況說明 程序計數(shù)器:看做當(dāng)前線程所執(zhí)行的字節(jié)碼行號指示器...
    jemmm閱讀 2,305評論 0 9
  • [TOC] 內(nèi)存管理 一、托管堆基礎(chǔ) 在面向?qū)ο笾?,每個類型代表一種可使用的資源,要使用該資源,必須為代表資源的類...
    _秦同學(xué)_閱讀 4,111評論 0 3
  • 工作之余,想總結(jié)一下JVM相關(guān)知識。 Java運行時數(shù)據(jù)區(qū): Java虛擬機(jī)在執(zhí)行Java程序的過程中會將其管理的...
    Huang遠(yuǎn)閱讀 683評論 0 2
  • 第二部分 自動內(nèi)存管理機(jī)制 第二章 java內(nèi)存異常與內(nèi)存溢出異常 運行數(shù)據(jù)區(qū)域 程序計數(shù)器:當(dāng)前線程所執(zhí)行的字節(jié)...
    小明oh閱讀 1,279評論 0 2
  • 合星財富:認(rèn)識基金了解基金投資的風(fēng)險 基金是一種大眾化的信托投資工具,這種投資工具由基金管理公司或其它發(fā)起人發(fā)起,...
    fa138d87b42f閱讀 238評論 0 0

友情鏈接更多精彩內(nèi)容