JVM內(nèi)存自動管理機制

本文主要總結(jié)java虛擬機的內(nèi)存管理機制,不同的數(shù)據(jù)類型存在在怎樣的一塊內(nèi)存區(qū)域中,不同的內(nèi)存區(qū)域有哪些不同點,怎樣回收過了生命周期的內(nèi)存,采取何種策略去回收這些對象或者常量,不同的回收算法的優(yōu)缺點.什么情況下會產(chǎn)生內(nèi)存溢出異常以及該采取怎樣的措施避免內(nèi)存溢出,以及一些常用的虛擬機性能監(jiān)控工具和故障排除工具
-<<深入理解java虛擬機>>讀書筆記

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

虛擬機管理的運行時數(shù)據(jù)區(qū)域如下圖所示

虛擬機運行時數(shù)據(jù)區(qū)域圖例

方法區(qū)

方法區(qū)是各個線程共享的內(nèi)存區(qū)域(這樣就能理解為什么需要線程同步和加鎖了,當然還與java數(shù)據(jù)訪問時數(shù)據(jù)復制來復制去有關),用于存儲已被虛擬機加載的類信息,常量,靜態(tài)變量,JIT即時編譯后的代碼等.
方法區(qū)的數(shù)據(jù)類型復雜,而且jvm規(guī)范也沒有明確指定方法區(qū)的內(nèi)存使用和回收策略,所以不同的虛擬機對于方法區(qū)的內(nèi)存回收都有不同的機制.下文介紹.

運行時常量池

運行時常量池是方法區(qū)的一部分,存儲編譯時或者運行時產(chǎn)生的字面常量或者其他信息.

堆也是被各個線程共享的內(nèi)存區(qū)域,虛擬機主要管理的內(nèi)存區(qū)域,是java存放對象數(shù)據(jù)的地方,這里面也有指針,因為對象數(shù)據(jù)里面可能還有其他對象的引用,還有方法區(qū)常量池常量的引用.還有數(shù)組也是在堆上分配內(nèi)存.

虛擬機棧

線程私有,與線程同生同滅.用于存儲java運行時的內(nèi)存模型,也就是每個方法執(zhí)行時的一個棧幀,該棧幀存儲了局部變量表,操作數(shù)棧,動態(tài)鏈表,方法出口等運行時信息.
對于一個方法開始執(zhí)行到執(zhí)行結(jié)束就是一個棧幀在虛擬機中入棧和出棧的過程.

程序計數(shù)器

和虛擬棧幀一樣,該內(nèi)存區(qū)域的生命周期也是在一個線程的執(zhí)行周期內(nèi).可以看作當前線程執(zhí)行字節(jié)碼行號的指示器,字節(jié)碼的解釋執(zhí)行工作就是通過這個來確定循環(huán),判斷,跳轉(zhuǎn),異常處理以及線程恢復等功能.
每個線程擁有一個獨立的程序計數(shù)器內(nèi)存區(qū)域可以使得多線程環(huán)境下線程能接著上一個時間片繼續(xù)執(zhí)行.

本地方法棧

本地方法棧與虛擬機棧的作用幾乎相同,不同的地方在于虛擬機棧用于服務java方法,而本地方法棧可以描述native方法,即虛擬機規(guī)范規(guī)定的可使用的其他語言.

直接內(nèi)存

直接內(nèi)存不是虛擬機運行時數(shù)據(jù)取的一部分
在jdk1.4后引入了一種通道和緩沖區(qū)的I/O方式,使用native函數(shù)庫直接分配堆外內(nèi)存,然后通過一個存儲在java堆中的DirectByteBuffer對象作為這塊內(nèi)存的引用直接進行操作,這樣能在一定的場景下顯著提高性能,避免了在java堆中和native堆中來回復制數(shù)據(jù).

數(shù)據(jù)在上述內(nèi)存區(qū)域的分布

對象的兩種不同訪問形式

直接指針方式訪問對象

這樣看句柄就是一系列的指針和其他數(shù)據(jù)組成的數(shù)據(jù)結(jié)構(gòu),果然是要好好學習數(shù)據(jù)結(jié)構(gòu)
間接指針訪問對象

jvm內(nèi)存溢出

內(nèi)存溢出即指上述內(nèi)存區(qū)域存放的數(shù)據(jù)結(jié)構(gòu)的總量大于限制的最大大小,導致虛擬機跑出內(nèi)存溢出異常.

虛擬機垃圾收集器

如何判斷對象需要被回收削解?
對于不同的算法有不同的判斷方式

堆中垃圾回收算法

引用計數(shù)算法
給每個對象添加一個引用計數(shù)器炮车,每當有一個地方引用它時淫茵,計數(shù)器加一嗓蘑,引用失效則減一。
優(yōu)點:實現(xiàn)簡單吧趣,判斷效率高
缺點:當對象存在相互引用時和悦,不能夠回收此類對象
可達性分析算法
可達性算法的核心在于找到一系列的根節(jié)點,并且判斷對象到這些根節(jié)點是否可達榜揖。
可作為根節(jié)點的對象有:

  1. 虛擬機棧中引用的對象
  2. 方法取中靜態(tài)屬性引用的對象
  3. 方法取中常量引用的對象
  4. 本地方法棧中JNI引用的對象

四種引用
強引用-軟引用-弱引用-虛引用

方法區(qū)中垃圾回收算法

標記-清除算法
首先標記出所有需要回收的對象勾哩,在標記完成后統(tǒng)一進行回收,但是缺點就是會造成大量的內(nèi)存碎片举哟。導致之后給大的對象分配內(nèi)存無可用空間思劳。
復制算法
將可用的內(nèi)存分為兩半,一次只使用其中的一半妨猩,當使用完以后潜叛,將還活著的對象全部復制到另一半內(nèi)存空間中,然后清理掉原來的那半內(nèi)存壶硅,缺點就是代價太高钠导,需要犧牲一半的內(nèi)存震嫉。
標記-整理算法
將所有的對象像一端移動,然后直接清理掉其他的對象(98%的對象生命周期都很短)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末牡属,一起剝皮案震驚了整個濱河市票堵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌逮栅,老刑警劉巖悴势,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異措伐,居然都是意外死亡特纤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門侥加,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捧存,“玉大人,你說我怎么就攤上這事担败∥粞ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵提前,是天一觀的道長吗货。 經(jīng)常有香客問我,道長狈网,這世上最難降的妖魔是什么宙搬? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮拓哺,結(jié)果婚禮上勇垛,老公的妹妹穿的比我還像新娘。我一直安慰自己士鸥,他們只是感情好窥摄,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著础淤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哨苛。 梳的紋絲不亂的頭發(fā)上鸽凶,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音建峭,去河邊找鬼玻侥。 笑死,一個胖子當著我的面吹牛亿蒸,可吹牛的內(nèi)容都是我干的凑兰。 我是一名探鬼主播掌桩,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼姑食!你這毒婦竟也來了波岛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤音半,失蹤者是張志新(化名)和其女友劉穎则拷,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體曹鸠,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡煌茬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了彻桃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坛善。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖邻眷,靈堂內(nèi)的尸體忽然破棺而出眠屎,到底是詐尸還是另有隱情,我是刑警寧澤耗溜,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布组力,位于F島的核電站,受9級特大地震影響抖拴,放射性物質(zhì)發(fā)生泄漏燎字。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一阿宅、第九天 我趴在偏房一處隱蔽的房頂上張望候衍。 院中可真熱鬧,春花似錦洒放、人聲如沸蛉鹿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽妖异。三九已至,卻和暖如春领追,著一層夾襖步出監(jiān)牢的瞬間他膳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工绒窑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留棕孙,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像蟀俊,于是被迫代替她去往敵國和親钦铺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

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

  • JVM內(nèi)存模型Java虛擬機(Java Virtual Machine=JVM)的內(nèi)存空間分為五個部分肢预,分別是: ...
    光劍書架上的書閱讀 2,509評論 2 26
  • 寫在前面本文介紹的Java虛擬機(JVM)的自動內(nèi)存管理機制主要是參照《深入理解Java虛擬機》(第2版)一書中的...
    EakonZhao閱讀 4,243評論 5 48
  • 從三月份找實習到現(xiàn)在矛洞,面了一些公司,掛了不少误甚,但最終還是拿到小米缚甩、百度、阿里窑邦、京東擅威、新浪、CVTE冈钦、樂視家的研發(fā)崗...
    時芥藍閱讀 42,243評論 11 349
  • 以早餐開啟生活的一天是大多數(shù)人的常態(tài)選擇郊丛。一日之際在于晨,早晨的時光往往奠定了一天的基調(diào)瞧筛。從粗糙到精致厉熟,從簡單到豐...
    wshmother閱讀 897評論 0 3
  • 前言:整理了下最近裝的AS插件(自己寫的才適合自己,最近我也在學習较幌,想寫一款屬于自己的插件揍瑟。建議大家都去學下如何寫...
    亂碼桑閱讀 3,039評論 8 26