Java 內(nèi)存區(qū)域

運(yùn)行時(shí)數(shù)據(jù)區(qū)域

程序計(jì)數(shù)器

線程所執(zhí)行的字節(jié)碼行號指示器。
唯一沒有規(guī)定OutOfMemoryError的區(qū)域

java虛擬機(jī)棧

為虛擬機(jī)的Native方法創(chuàng)建的棧針,用于存儲局部變量表,操作數(shù)幀,動(dòng)態(tài)鏈接,方法出口信息

本地方法棧

為自己定義的Java方法進(jìn)行服務(wù)

java堆

目的:存放實(shí)例,在這里分配內(nèi)存 1.7之后常量池也在這里
1/3 年輕代 1/10 to Servivor 1/10 from Servivor 8/10 Eden
2/3 老年代

  • 方法區(qū)

各個(gè)線程共享的內(nèi)存區(qū)域,存儲加載的類信息,常量,靜態(tài)變量,即時(shí)編譯器編譯后的代碼等
“永久代”:并不是永久存在,只是回收效率低,容易發(fā)生內(nèi)存泄露

  • 常量池

類的 版本,字段,方法,接口等描述信息,在運(yùn)行過程中也可能會(huì)加入新的常量。
new String都是在堆上創(chuàng)建字符串對象。當(dāng)調(diào)用 intern() 方法時(shí),編譯器會(huì)將字符串添加到常量池中(stringTable維護(hù)),并返回指向該常量的引用。 通過字面量賦值創(chuàng)建字符串(如:String str=”twm”)時(shí),會(huì)先在常量池中查找是否存在相同的字符串,若存在,則將棧中的引用直接指向該字符串;若不存在,將在堆上的地址引用復(fù)制到常量池。
引號聲明的字符串都是會(huì)直接在字符串常量池中生成的,而 new 出來的 String 對象是放在堆空間中的。所以兩者的內(nèi)存地址肯定是不相同的,

直接內(nèi)存

不受Java堆的限制,可以用Native函數(shù)庫直接操作分配堆外內(nèi)存,并對其進(jìn)行操作。

對象創(chuàng)建

1.指針碰撞 Serial、PraNew等存在將空間壓實(shí)的回收器
2.空閑列表 CMS

一個(gè)對象的組成

對象頭

1.自身運(yùn)行時(shí)的數(shù)據(jù)【長度 32bit/32位虛擬機(jī) OR 64bit/64位虛擬機(jī)】
HashCode
GC分代年齡
鎖狀態(tài)標(biāo)志
線程持有的鎖
偏向線程id
偏向時(shí)間戳
2.類型指針
ps:數(shù)組的大小信息也放在這里。所以普通JAVA對象可以通過元信息知道對象大小,但是數(shù)組不行,在元信息中沒有該大小信息,需要在對象頭里查看

實(shí)例數(shù)據(jù)

真實(shí)數(shù)據(jù)的地方。父類的變量出現(xiàn)于子類之前

對齊填充

占位符的作用

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

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

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