第2章 Java內(nèi)存區(qū)域與內(nèi)存溢出異常
運(yùn)行數(shù)據(jù)區(qū)域
1、程序計(jì)數(shù)器(PRogram Counter Register) 是一塊較小的內(nèi)存空間,它可以看作是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器。
2、Java虛擬機(jī)棧(Stack)線程私有,每一個(gè)方法調(diào)用時(shí)都會(huì)創(chuàng)建一個(gè)棧幀(Stack Frame)用于存儲(chǔ)局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口等信息。局部變量存放了編譯期可知的各種基本數(shù)據(jù)類型(boolean,byte,char,short,int,float,long,double)、對(duì)象引用(reference類型)和returnAddress類型。
3、本地方法棧(Native Method Stack),為虛擬機(jī)的本地方法提供的棧
4、java堆(Heap) 所有線程共享的一塊內(nèi)存區(qū)域,存放對(duì)象實(shí)例。可能會(huì)被分為:新生代和老年代。再細(xì)致一點(diǎn)的有Eden空間、From Survivor空間、To Survivor空間等。
5、方法區(qū)(Method Area) 各純種共享的內(nèi)存區(qū)域,用于存儲(chǔ)已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。通常被 稱為 永久代(Permanent Generation)
6、運(yùn)行時(shí)常量池(Runtime Constant Pool)是方法區(qū)的一部分,用于存放編譯期生成的各種 字面量和符號(hào)引用,這部分內(nèi)容將在類加載后進(jìn)入方法區(qū)的運(yùn)行時(shí)常量池中存放。
7、直接內(nèi)存(Direct Memory)

HotSpot虛擬機(jī)對(duì)象探秘
對(duì)象創(chuàng)建
1、虛擬機(jī)遇到一個(gè)new指今,檢查這個(gè)指今參數(shù)是否能在常量池中定位。
2、檢查這個(gè)符號(hào)引用代表的類是否已被加載解析和初始化
如果沒有先執(zhí)行相應(yīng)的類加載過程。
3、分配內(nèi)存,對(duì)象所需內(nèi)存的大小在類加載完成后便可完全確定。
4、將分配的內(nèi)存空間都初始化為零值,這一步保證了對(duì)象的實(shí)例字段在java代碼中可以不賦初始值就直接使用。
5、虛擬機(jī)對(duì)對(duì)象進(jìn)行必要的設(shè)置,如何才能找到類的元數(shù)據(jù)信息、對(duì)象的哈希碼、對(duì)象的GC分代等這些信息存放在對(duì)象的對(duì)象頭中
6、構(gòu)造函數(shù)
對(duì)象的內(nèi)存布局:可以分為3塊區(qū)域:對(duì)象頭(Header)、實(shí)例數(shù)據(jù)(Instance Data)和對(duì)齊填充(Padding)
對(duì)象的訪問定位:
通過句柄訪問對(duì)象
對(duì)過直接指針訪問對(duì)象
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注