JVM內(nèi)存模型及對(duì)象的生死

## 1 JVM內(nèi)存劃分 ![](https://upload-images.jianshu.io/upload_images/20040176-17666a7d9b5b162f.png) ## 2 分區(qū) JVM 內(nèi)存區(qū)域主要分為線程私有區(qū)域【程序計(jì)數(shù)器、虛擬機(jī)棧哗魂、本地方法區(qū)】、線程共享區(qū)域【JAVA 堆捺癞、方法區(qū)】、直接內(nèi)存杆故。 ### 2.1 程序計(jì)數(shù)器 一塊較小的內(nèi)存空間, 是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器豆茫,每條線程都要有一個(gè)獨(dú)立的程序計(jì)數(shù)器侨歉,這類內(nèi)存也稱為“線程私有”的內(nèi)存。 正在執(zhí)行 java 方法的話揩魂,計(jì)數(shù)器記錄的是虛擬機(jī)字節(jié)碼指令的地址(當(dāng)前指令的地址)幽邓。如果還是 Native 方法,則為空火脉。 這個(gè)內(nèi)存區(qū)域是唯一一個(gè)在虛擬機(jī)中沒(méi)有規(guī)定任何 OutOfMemoryError 情況的區(qū)域牵舵。 ### 2.2 虛擬機(jī)棧 是描述 java 方法執(zhí)行的內(nèi)存模型柒啤,每個(gè)方法在執(zhí)行的同時(shí)都會(huì)創(chuàng)建一個(gè)棧幀(Stack Frame)用于存儲(chǔ)局部變量表、操作數(shù)棧畸颅、動(dòng)態(tài)鏈接担巩、 方法出口等信息。每一個(gè)方法從調(diào)用直至執(zhí)行完成的過(guò)程没炒,就對(duì)應(yīng)著一個(gè)棧幀在虛擬機(jī)棧中入棧到出棧的過(guò)程涛癌。 ### 2.3 本地方法區(qū) 本地方法區(qū)和 Java Stack 作用類似, 區(qū)別是虛擬機(jī)棧為執(zhí)行 Java 方法服務(wù), 而本地方法棧則為Native 方法服務(wù), 如果一個(gè) VM 實(shí)現(xiàn)使用 C-linkage 模型來(lái)支持 Native 調(diào)用, 那么該棧將會(huì)是一個(gè)C棧,但 HotSpot VM 直接就把本地方法棧和虛擬機(jī)棧合二為一送火。 ## 2.4 堆-運(yùn)行時(shí)數(shù)據(jù)區(qū) 是被線程共享的一塊內(nèi)存區(qū)域掺逼,創(chuàng)建的對(duì)象和數(shù)組都保存在 Java 堆內(nèi)存中蝙搔,也是垃圾收集器進(jìn)行垃圾收集的最重要的內(nèi)存區(qū)域坤按。由于現(xiàn)代 VM 采用分代收集算法, 因此 Java 堆從 GC 的角度還可以細(xì)分為: 新生代(Eden 區(qū)惊豺、From Survivor(S0) 區(qū)和 To Survivor (S1)區(qū))和老年代。 ## 2.5 方法區(qū) 即我們常說(shuō)的永久代(Permanent Generation), 用于存儲(chǔ)被 JVM 加載的類信息坚俗、常量镜盯、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù). HotSpot VM把 GC分代收集擴(kuò)展至方法區(qū), 即使用Java堆的永久代來(lái)實(shí)現(xiàn)方法區(qū), 這樣 HotSpot 的垃圾收集器就可以像管理 Java 堆一樣管理這部分內(nèi)存, 而不必為方法區(qū)開發(fā)專門的內(nèi)存管理器(永久帶的內(nèi)存回收的主要目標(biāo)是針對(duì)常量池的回收和類型的卸載, 因此收益一般很小)猖败。 運(yùn)行時(shí)常量池(Runtime Constant Pool)是方法區(qū)的一部分速缆。Class 文件中除了有類的版 本、字段辙浑、方法激涤、接口等描述等信息外,還有一項(xiàng)信息是常量池 判呕。 >1.7之后已經(jīng)移除了永久代,而是元空間 元空間的本質(zhì)和永久代類似送滞,都是對(duì)JVM規(guī)范中方法區(qū)的實(shí)現(xiàn)侠草。不過(guò)元空間與永久代之間最大的區(qū)別在于:元空間并不在虛擬機(jī)中,而是使用本地內(nèi)存犁嗅。因此边涕,默認(rèn)情況下,元空間的大小僅受本地內(nèi)存限制褂微,但可以通過(guò)以下參數(shù)來(lái)指定元空間的大泄︱选: - -XX:MetaspaceSize,初始空間大小宠蚂,達(dá)到該值就會(huì)觸發(fā)垃圾收集進(jìn)行類型卸載式撼,同時(shí)GC會(huì)對(duì)該值進(jìn)行調(diào)整:如果釋放了大量的空間,就適當(dāng)降低該值求厕;如果釋放了很少的空間著隆,那么在不超過(guò)MaxMetaspaceSize時(shí)扰楼,適當(dāng)提高該值。 - -XX:MaxMetaspaceSize美浦,最大空間弦赖,默認(rèn)是沒(méi)有限制的。 - -XX:MinMetaspaceFreeRatio浦辨,在GC之后蹬竖,最小的Metaspace剩余空間容量的百分比,減少為分配空間所導(dǎo)致的垃圾收集 - -XX:MaxMetaspaceFreeRatio流酬,在GC之后币厕,最大的Metaspace剩余空間容量的百分比,減少為釋放空間所導(dǎo)致的垃圾收集 ## 3 JVM基礎(chǔ) ### 3.1 對(duì)象的創(chuàng)建 對(duì)于內(nèi)存不規(guī)整的情況康吵,容易發(fā)生指針碰撞 對(duì)于內(nèi)存規(guī)整的情況劈榨,容易產(chǎn)生空閑列表 ### 3.2 對(duì)象內(nèi)存布局 - 對(duì)象頭(Mark Word):存儲(chǔ)對(duì)象自身的運(yùn)行時(shí)數(shù)據(jù),如哈希碼晦嵌,GC分帶年齡同辣,鎖狀態(tài)標(biāo)志,線程持有的鎖惭载,偏向線程ID旱函,偏向時(shí)間戳。 數(shù)據(jù)長(zhǎng)度在32位和64位虛擬機(jī)中分別為32bit和64bit描滔。另外一部分是類型指針棒妨,即對(duì)象指向它的類元數(shù)據(jù)的指針。 - 實(shí)例數(shù)據(jù):真正的有效信息含长,定義的各種類型字段的內(nèi)容券腔,父類繼承的也會(huì)記錄。 - 對(duì)齊填充:不是必然存在的拘泞,HotSpot要求對(duì)象起始地址(對(duì)象大蟹兹摇)必須是8的倍數(shù),對(duì)象頭部分剛好是1倍或2倍陪腌,因此當(dāng)實(shí)例數(shù)據(jù)部分沒(méi)對(duì)齊時(shí)辱魁,就需要自動(dòng)填充來(lái)補(bǔ)齊。 ### 3.3 對(duì)象是否存活 - 引用計(jì)數(shù)法:給對(duì)象添加一個(gè)引用計(jì)數(shù)器诗鸭,有一個(gè)引用加1染簇,引用失效時(shí)減1,計(jì)數(shù)器為0則對(duì)象不再被使用强岸。缺點(diǎn)無(wú)法解決循環(huán)引用的問(wèn)題锻弓。 - 可達(dá)性分析法:通過(guò)一系列的“GC Roots”的對(duì)象作為起始點(diǎn),往下搜索请唱,當(dāng)一個(gè)對(duì)象到達(dá)GC Roots沒(méi)有任何引用鏈相連弥咪,則對(duì)象不可用过蹂,可回收。 **GC Roots**: - 虛擬機(jī)棧(棧針中的本地變量表)中引用的對(duì)象 - 方法區(qū)中的類靜態(tài)屬性引用的對(duì)象 - 方法區(qū)中常量引用的對(duì)象 - 本地方法棧中JNI(Native方法)引用的對(duì)象 ### 3.4 對(duì)象的生或死 在可達(dá)性分析算法中的不可達(dá)對(duì)象聚至,也不是非死不可酷勺,宣告一個(gè)對(duì)象的死亡,至少要經(jīng)過(guò)兩次標(biāo)記過(guò)程扳躬,沒(méi)有引用鏈的對(duì)象脆诉, 會(huì)進(jìn)行第一次標(biāo)記并且篩選,篩選條件是此對(duì)象是否有必要執(zhí)行finalize()方法贷币。當(dāng)對(duì)象沒(méi)有覆蓋finalize()方法或者虛擬機(jī)已經(jīng)執(zhí)行過(guò)击胜, 則視為沒(méi)必要執(zhí)行。finalize()只會(huì)被系統(tǒng)調(diào)用一次役纹。對(duì)象有可能在finalize方法中被拯救偶摔。 本文由[mdnice](https://mdnice.com/?platform=6)多平臺(tái)發(fā)布
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市促脉,隨后出現(xiàn)的幾起案子辰斋,更是在濱河造成了極大的恐慌,老刑警劉巖瘸味,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宫仗,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡旁仿,警方通過(guò)查閱死者的電腦和手機(jī)藕夫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)枯冈,“玉大人毅贮,你說(shuō)我怎么就攤上這事〕咀啵” “怎么了嫩码?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)罪既。 經(jīng)常有香客問(wèn)我,道長(zhǎng)铡恕,這世上最難降的妖魔是什么琢感? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮探熔,結(jié)果婚禮上驹针,老公的妹妹穿的比我還像新娘。我一直安慰自己诀艰,他們只是感情好柬甥,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布饮六。 她就那樣靜靜地躺著,像睡著了一般苛蒲。 火紅的嫁衣襯著肌膚如雪卤橄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天臂外,我揣著相機(jī)與錄音窟扑,去河邊找鬼。 笑死漏健,一個(gè)胖子當(dāng)著我的面吹牛嚎货,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蔫浆,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼殖属,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了瓦盛?” 一聲冷哼從身側(cè)響起洗显,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谭溉,沒(méi)想到半個(gè)月后墙懂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扮念,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年损搬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柜与。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡巧勤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出弄匕,到底是詐尸還是另有隱情颅悉,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布迁匠,位于F島的核電站剩瓶,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏城丧。R本人自食惡果不足惜延曙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望亡哄。 院中可真熱鬧枝缔,春花似錦、人聲如沸蚊惯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至趴荸,卻和暖如春儒溉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赊舶。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工睁搭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人笼平。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓园骆,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親寓调。 傳聞我的和親對(duì)象是個(gè)殘疾皇子锌唾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容