2020-03-04 垃圾回收機(jī)制

Q:Jvm內(nèi)存模型?
A:Jvm(Java虛擬機(jī))主要管理兩種類型內(nèi)存:堆和非堆堆是運(yùn)行時(shí)數(shù)據(jù)區(qū)域,所有類實(shí)例和數(shù)組的內(nèi)存均從此處分配寂祥。 非堆是JVM留給自己用的,包含方法區(qū)七兜、JVM內(nèi)部處理或優(yōu)化所需的內(nèi)存(如 JIT Compiler,Just-in-time Compiler福扬,即時(shí)編譯后的代碼緩存)腕铸、每個(gè)類結(jié)構(gòu)(如運(yùn)行時(shí)常數(shù)池惜犀、字段和方法數(shù)據(jù))以及方法和構(gòu)造方法的代碼。

簡(jiǎn)言之狠裹,Java程序內(nèi)存主要(這里強(qiáng)調(diào)主要二字)分兩部分虽界,堆和非堆。大家一般new的對(duì)象和數(shù)組都是在堆中的涛菠,而GC主要回收的內(nèi)存也是這塊堆內(nèi)存莉御。

Java虛擬機(jī)采用的是分代回收算法

幾種垃圾回收算法

1:標(biāo)記清除算法 (Mark-Sweep)
標(biāo)記-清除算法分為兩個(gè)階段:標(biāo)記階段和清除階段。標(biāo)記階段的任務(wù)是標(biāo)記出所有需要被回收的對(duì)象俗冻,清除階段就是回收被標(biāo)記的對(duì)象所占用的空間礁叔。 優(yōu)點(diǎn)是簡(jiǎn)單,容易實(shí)現(xiàn)迄薄。 缺點(diǎn)是容易產(chǎn)生內(nèi)存碎片琅关,碎片太多可能會(huì)導(dǎo)致后續(xù)過程中需要為大對(duì)象分配空間時(shí)無(wú)法找到足夠的空間而提前觸發(fā)新的一次垃圾收集動(dòng)作

2:復(fù)制算法 (Copying)
復(fù)制算法將可用內(nèi)存按容量劃分為大小相等的兩塊,每次只使用其中的一塊讥蔽。當(dāng)這一塊的內(nèi)存用完了涣易,就將還存活著的對(duì)象復(fù)制到另外一塊上面,然后再把已使用的內(nèi)存空間一次清理掉冶伞,這樣一來(lái)就不容易出現(xiàn)內(nèi)存碎片的問題新症。 優(yōu)缺點(diǎn)就是,實(shí)現(xiàn)簡(jiǎn)單响禽,運(yùn)行高效且不容易產(chǎn)生內(nèi)存碎片徒爹,但是卻對(duì)內(nèi)存空間的使用做出了高昂的代價(jià),因?yàn)槟軌蚴褂玫膬?nèi)存縮減到原來(lái)的一半金抡。 從算法原理我們可以看出瀑焦,Copying算法的效率跟存活對(duì)象的數(shù)目多少有很大的關(guān)系,如果存活對(duì)象很多梗肝,那么Copying算法的效率將會(huì)大大降低

3:標(biāo)記整理算法 (Mark-Compact)
該算法標(biāo)記階段和Mark-Sweep一樣榛瓮,但是在完成標(biāo)記之后,它不是直接清理可回收對(duì)象巫击,而是將存活對(duì)象都向一端移動(dòng)禀晓,然后清理掉端邊界以外的內(nèi)存。 所以坝锰,特別適用于存活對(duì)象多粹懒,回收對(duì)象少的情況下

4:分代回收算法
分代回收算法其實(shí)不算一種新的算法,而是根據(jù)復(fù)制算法和標(biāo)記整理算法的的特點(diǎn)綜合而成. 復(fù)制算法:適用于存活對(duì)象很少顷级≠旃裕回收對(duì)象多 標(biāo)記整理算法: 適用用于存活對(duì)象多,回收對(duì)象少

備注:對(duì)于新生代采取Copying算法,因?yàn)樾律忻看卫厥斩家厥沾蟛糠謱?duì)象帽芽,也就是說(shuō)需要復(fù)制的操作次數(shù)較少删掀,采用Copying算法效率最高。但是导街,但是披泪,但是,實(shí)際中并不是按照上面算法中說(shuō)的1:1的比例來(lái)劃分新生代的空間的搬瑰,而是將新生代劃分為一塊較大的Eden空間和兩塊較小的Survivor空間款票,比例為8:1:1.。為什么泽论?下一節(jié)深入分析艾少。
由于老年代的特點(diǎn)是每次回收都只回收少量對(duì)象,一般使用的是Mark-Compact算法佩厚。

Q:為什么不是一塊Survivor空間而是兩塊姆钉?
A: 這里涉及到一個(gè)新生代和老年代的存活周期的問題,比如一個(gè)對(duì)象在新生代經(jīng)歷15次(僅供參考)GC抄瓦,就可以移到老年代了潮瓶。問題來(lái)了,當(dāng)我們第一次GC的時(shí)候钙姊,我們可以把Eden區(qū)的存活對(duì)象放到Survivor A空間毯辅,但是第二次GC的時(shí)候,Survivor A空間的存活對(duì)象也需要再次用Copying算法煞额,放到Survivor B空間上思恐,而把剛剛的Survivor A空間和Eden空間清除。第三次GC時(shí)膊毁,又把Survivor B空間的存活對(duì)象復(fù)制到Survivor A空間胀莹,如此反復(fù)。 所以婚温,這里就需要兩塊Survivor空間來(lái)回倒騰描焰。

Q:為什么Eden空間這么大而Survivor空間要分的少一點(diǎn)?
A: 新創(chuàng)建的對(duì)象都是放在Eden空間栅螟,這是很頻繁的荆秦,尤其是大量的局部變量產(chǎn)生的臨時(shí)對(duì)象,這些對(duì)象絕大部分都應(yīng)該馬上被回收力图,能存活下來(lái)被轉(zhuǎn)移到survivor空間的往往不多步绸。所以,設(shè)置較大的Eden空間和較小的Survivor空間是合理的吃媒,大大提高了內(nèi)存的使用率瓤介,緩解了Copying算法的缺點(diǎn)吕喘。 我看8:1:1就挺好的,當(dāng)然這個(gè)比例是可以調(diào)整的刑桑,包括上面的新生代和老年代的1:2的比例也是可以調(diào)整的兽泄。 新的問題又來(lái)了,從Eden空間往Survivor空間轉(zhuǎn)移的時(shí)候Survivor空間不夠了怎么辦漾月?直接放到老年代去

Q: Eden空間和兩塊Survivor空間的工作流程?
// 分配了一個(gè)又一個(gè)對(duì)象
放到Eden區(qū)
// 不好,Eden區(qū)滿了胃珍,只能GC(新生代GC:Minor GC)了
把Eden區(qū)的存活對(duì)象copy到Survivor A區(qū)梁肿,然后清空Eden區(qū)(本來(lái)Survivor B區(qū)也需要清空的,不過本來(lái)就是空的)
// 又分配了一個(gè)又一個(gè)對(duì)象
放到Eden區(qū)
// 不好觅彰,Eden區(qū)又滿了吩蔑,只能GC(新生代GC:Minor GC)了
把Eden區(qū)和Survivor A區(qū)的存活對(duì)象copy到Survivor B區(qū),然后清空Eden區(qū)和Survivor A區(qū)
// 又分配了一個(gè)又一個(gè)對(duì)象
放到Eden區(qū)
// 不好填抬,Eden區(qū)又滿了烛芬,只能GC(新生代GC:Minor GC)了
把Eden區(qū)和Survivor B區(qū)的存活對(duì)象copy到Survivor A區(qū),然后清空Eden區(qū)和Survivor B區(qū)
// ...
// 有的對(duì)象來(lái)回在Survivor A區(qū)或者B區(qū)呆了比如15次飒责,就被分配到老年代Old區(qū)
// 有的對(duì)象太大赘娄,超過了Eden區(qū),直接被分配在Old區(qū)
// 有的存活對(duì)象宏蛉,放不下Survivor區(qū)遣臼,也被分配到Old區(qū)
// ...
// 在某次Minor GC的過程中突然發(fā)現(xiàn):
// 不好,老年代Old區(qū)也滿了拾并,這是一次大GC(老年代GC:Major GC)
Old區(qū)慢慢的整理一番揍堰,空間又夠了
// 繼續(xù)Minor GC
// ...

觸發(fā)GC的類型:
GC_FOR_MALLOC: 表示是在堆上分配對(duì)象時(shí)內(nèi)存不足觸發(fā)的GC。 GC_CONCURRENT: 當(dāng)我們應(yīng)用程序的堆內(nèi)存達(dá)到一定量嗅义,或者可以理解為快要滿的時(shí)候屏歹,系統(tǒng)會(huì)自動(dòng)觸發(fā)GC操作來(lái)釋放內(nèi)存。 GC_EXPLICIT: 表示是應(yīng)用程序調(diào)用System.gc之碗、VMRuntime.gc接口或者收到SIGUSR1信號(hào)時(shí)觸發(fā)的GC蝙眶。 GC_BEFORE_OOM: 表示是在準(zhǔn)備拋OOM異常之前進(jìn)行的最后努力而觸發(fā)的GC

備注:此篇文章只作為筆記記錄。
感謝 文章原著:https://github.com/xiangjiana/Android-MS/blob/master/study/framework/Android%E6%B6%88%E6%81%AF%E6%9C%BA%E5%88%B6.md

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末继控,一起剝皮案震驚了整個(gè)濱河市械馆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌武通,老刑警劉巖霹崎,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異冶忱,居然都是意外死亡尾菇,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)派诬,“玉大人劳淆,你說(shuō)我怎么就攤上這事∧福” “怎么了沛鸵?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)缆八。 經(jīng)常有香客問我曲掰,道長(zhǎng),這世上最難降的妖魔是什么奈辰? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任栏妖,我火速辦了婚禮,結(jié)果婚禮上奖恰,老公的妹妹穿的比我還像新娘吊趾。我一直安慰自己,他們只是感情好瑟啃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布论泛。 她就那樣靜靜地躺著,像睡著了一般翰守。 火紅的嫁衣襯著肌膚如雪孵奶。 梳的紋絲不亂的頭發(fā)上蜡峰,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天载绿,我揣著相機(jī)與錄音,去河邊找鬼崭庸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛函筋,可吹牛的內(nèi)容都是我干的跌帐。 我是一名探鬼主播究履,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼炊甲,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了牵囤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乓梨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體臭觉,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡揩懒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了渠缕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出测暗,到底是詐尸還是另有隱情,我是刑警寧澤稚字,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布袄友,位于F島的核電站,受9級(jí)特大地震影響鸠按,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜扎运,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一瑟曲、第九天 我趴在偏房一處隱蔽的房頂上張望饮戳。 院中可真熱鬧扯罐,春花似錦、人聲如沸烦衣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至贬派,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間澎媒,已是汗流浹背搞乏。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留储玫,地道東北人侍筛。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像撒穷,于是被迫代替她去往敵國(guó)和親匣椰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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

  • 如果你想要從太空觀察地球端礼,衛(wèi)星技術(shù)就能夠做到這一點(diǎn)禽笑。圖中的海洋流是衛(wèi)星地圖展現(xiàn)的入录,紫色和粉紅色的漩渦代表更暖的洋流...
    allever閱讀 1,400評(píng)論 0 8
  • 來(lái)自: Android夢(mèng)想特工隊(duì)作者: Aaron主頁(yè): http://www.wxtlife.com/原...
    技術(shù)特工隊(duì)閱讀 4,372評(píng)論 0 28
  • JVM架構(gòu) 當(dāng)一個(gè)程序啟動(dòng)之前,它的class會(huì)被類裝載器裝入方法區(qū)(Permanent區(qū))佳镜,執(zhí)行引擎讀取方法區(qū)的...
    cocohaifang閱讀 1,664評(píng)論 0 7
  • 作者:一字馬胡 轉(zhuǎn)載標(biāo)志 【2017-11-12】 更新日志 日期更新內(nèi)容備注 2017-11-12新建文章初版 ...
    beneke閱讀 2,203評(píng)論 0 7
  • 咔咔咔 火車在跑 夢(mèng)在原野上飛 隔著綠皮車頂我與夜空相對(duì) 夢(mèng)里黑夜撒下無(wú)數(shù)星星 等到太陽(yáng)升了起來(lái) 都化成了雪
    一張煎餅閱讀 212評(píng)論 0 0