Java堆外內(nèi)存的回收機(jī)制

1 堆外內(nèi)存

JVM啟動(dòng)時(shí)分配的內(nèi)存,稱為堆內(nèi)存甘畅,與之相對(duì)的,在代碼中還可以使用堆外內(nèi)存往弓,不如Netty疏唾,廣泛使用了堆外內(nèi)存,但是這部分內(nèi)存不歸JVM管理函似,GC算法并不會(huì)對(duì)它們進(jìn)行回收槐脏,所以使用堆外內(nèi)存是需要格外小心,以防出現(xiàn)內(nèi)存泄露撇寞。

2 堆外內(nèi)存的申請(qǐng)和釋放

JDK中使用DirectByteBuffer對(duì)象來(lái)表示堆外內(nèi)存顿天,可以通過(guò)-XX:MaxDirectMemorySize來(lái)指定最大的堆外內(nèi)存,每個(gè)DirectByteBuffer對(duì)象在初始化時(shí)蔑担,都會(huì)創(chuàng)建一個(gè)對(duì)應(yīng)的Cleaner對(duì)象牌废,在Cleaner對(duì)象回收的時(shí)候回收這部分堆外內(nèi)存。初始化時(shí)引用關(guān)系如下:


image

其中first是Cleaner類的靜態(tài)變量钟沛,Cleaner對(duì)象在初始化時(shí)會(huì)被添加到Clener鏈表中畔规,和first形成引用關(guān)系,ReferenceQueue是用來(lái)保存需要回收的Cleaner對(duì)象恨统。

3 Cleaner如何與GC相關(guān)聯(lián)

JDK除了StrongReference、SoftReference和WeakReference之外三妈,還有一種PhantomReference是虛引用畜埋,Cleaner就是PhantomReference的子類。(針對(duì)這幾種引用畴蒲,后續(xù)專題講解)

當(dāng)GC時(shí)發(fā)現(xiàn)它除了PhantomReference外已不可達(dá)(持有它的DirectByteBuffer失效了)悠鞍,就會(huì)把它放進(jìn) Reference類pending list靜態(tài)變量里。然后另有一條ReferenceHandler線程模燥,名字叫 "Reference Handler"的咖祭,關(guān)注著這個(gè)pending list,如果看到有對(duì)象類型是Cleaner蔫骂,就會(huì)執(zhí)行它的clean()么翰,在最終的處理里會(huì)通過(guò)Unsafe的free接口來(lái)釋放DirectByteBuffer對(duì)應(yīng)的堆外內(nèi)存塊。

4 堆外內(nèi)存基于GC的回收

快速回顧一下堆內(nèi)的GC機(jī)制辽旋,當(dāng)新生代滿了浩嫌,就會(huì)發(fā)生young gc檐迟;如果此時(shí)對(duì)象還沒(méi)失效,就不會(huì)被回收码耐;撐過(guò)幾次young gc后追迟,對(duì)象被遷移到老生代;當(dāng)老生代也滿了骚腥,就會(huì)發(fā)生full gc敦间。

這里可以看到一種尷尬的情況,因?yàn)镈irectByteBuffer本身的個(gè)頭很小束铭,只要熬過(guò)了young gc廓块,即使已經(jīng)失效了也能在老生代里舒服的呆著,不容易把老生代撐爆觸發(fā)full gc纯露,如果沒(méi)有別的大塊頭進(jìn)入老生代觸發(fā)full gc剿骨,就一直在那耗著,占著一大片堆外內(nèi)存不釋放埠褪。

    其實(shí)在初始化DirectByteBuffer對(duì)象時(shí)浓利,如果當(dāng)前堆外內(nèi)存的條件很苛刻時(shí),會(huì)主動(dòng)調(diào)用System.gc()強(qiáng)制執(zhí)行FGC钞速。

這時(shí)贷掖,就只能靠觸發(fā)system.gc()來(lái)救場(chǎng)了。如果還是無(wú)法釋放渴语,就可能會(huì)出現(xiàn)OOM苹威。

  不過(guò)很多線上環(huán)境的JVM參數(shù)有-XX:+DisableExplicitGC,導(dǎo)致了System.gc()等于一個(gè)空函數(shù)驾凶,根本不會(huì)觸發(fā)FGC牙甫,這點(diǎn)需要特別關(guān)注。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末调违,一起剝皮案震驚了整個(gè)濱河市窟哺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌技肩,老刑警劉巖且轨,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異虚婿,居然都是意外死亡旋奢,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)然痊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)至朗,“玉大人,你說(shuō)我怎么就攤上這事玷过∷ぃ” “怎么了筑煮?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)粤蝎。 經(jīng)常有香客問(wèn)我真仲,道長(zhǎng),這世上最難降的妖魔是什么初澎? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任秸应,我火速辦了婚禮,結(jié)果婚禮上碑宴,老公的妹妹穿的比我還像新娘软啼。我一直安慰自己,他們只是感情好延柠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布祸挪。 她就那樣靜靜地躺著,像睡著了一般贞间。 火紅的嫁衣襯著肌膚如雪贿条。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,482評(píng)論 1 302
  • 那天增热,我揣著相機(jī)與錄音整以,去河邊找鬼。 笑死峻仇,一個(gè)胖子當(dāng)著我的面吹牛公黑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播摄咆,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼凡蚜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了吭从?” 一聲冷哼從身側(cè)響起番刊,我...
    開(kāi)封第一講書(shū)人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎影锈,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蝉绷,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸭廷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了熔吗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辆床。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖桅狠,靈堂內(nèi)的尸體忽然破棺而出讼载,到底是詐尸還是另有隱情轿秧,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布咨堤,位于F島的核電站菇篡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏一喘。R本人自食惡果不足惜驱还,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凸克。 院中可真熱鬧议蟆,春花似錦、人聲如沸萎战。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蚂维。三九已至戳粒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸟雏,已是汗流浹背享郊。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留孝鹊,地道東北人炊琉。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像又活,于是被迫代替她去往敵國(guó)和親苔咪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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