1. Java內(nèi)存區(qū)域劃分
程序計(jì)數(shù)器
線程私有次舌,程序計(jì)數(shù)器用來指示當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào),是唯一一個(gè)沒有指
OutOfMemoryError的區(qū)域。
虛擬機(jī)棧
線程私有,虛擬機(jī)棧描述Java方法執(zhí)行的內(nèi)存模型,每個(gè)方法在運(yùn)行的時(shí)候都會(huì)創(chuàng)造一個(gè)棧幀豫缨,
用于存儲(chǔ)局部變量表(存放編譯期間已知的各種基本類型和對(duì)象引用類型和returnAddress類型,
其中l(wèi)ong和double占用兩個(gè)Slot)操作數(shù)棧、動(dòng)態(tài)鏈接靠益、方法出口等信息,每一個(gè)方法調(diào)用
到完成過程就是一個(gè)棧幀入棧到出棧的過程残揉。
Thrown:StackOverFlowError 和 OutOfMemoryError
本地方法棧
線程私有胧后,和虛擬機(jī)棧發(fā)揮的作用一樣,只不過用來處理Native方法抱环。
Thrown:StackOverFlowError 和 OutOfMemoryError
Java堆
線程共享壳快,存放對(duì)象實(shí)例,垃圾收集器管理的主要區(qū)域镇草。
Thrown:OutOfMemoryError
方法區(qū)
線程共享眶痰,存儲(chǔ)被虛擬機(jī)加載的類信息、常量梯啤、靜態(tài)變量凛驮、以及及時(shí)編譯后的代碼數(shù)據(jù)。
在HotSpot虛擬機(jī)實(shí)現(xiàn)的時(shí)候条辟,永久代也用方法區(qū)實(shí)現(xiàn)黔夭,其他虛擬機(jī)則不存在永久帶的概念。
運(yùn)行時(shí)常量池的實(shí)現(xiàn)也在方法區(qū)羽嫡。
Thrown:OutOfMemoryError
直接內(nèi)存
Throw:OutOfMemoryError
2. 對(duì)象
對(duì)象的新建
對(duì)象內(nèi)存布局
-----------------------------------------------------------------------------
對(duì)象自身的運(yùn)行時(shí)數(shù)據(jù)(hashcode本姥、 | 類型指針(指向它的類元數(shù)據(jù)的指針)
GC分代年齡、鎖狀態(tài)標(biāo)識(shí)等) | 不是所有虛擬機(jī)都需要保留此指針
-----------------------------------------------------------------------------
對(duì)象的訪問定位
- 使用句柄訪問
在java堆內(nèi)存中劃分出一部分作為句柄池杭棵,refernce存放的就是對(duì)象的句柄地址婚惫。句柄中包含對(duì)象實(shí)例數(shù)據(jù)的地址和類型數(shù)據(jù)的地址。
- 使用直接指針訪問
reference存放的就是對(duì)象的存儲(chǔ)地址魂爪,此時(shí)對(duì)象就需要考慮如何存放如何訪問對(duì)象類型數(shù)據(jù)的相關(guān)信息先舷。