垃圾回收算法瞎饲、回收機制與總結(jié) ---JVM

垃圾回收算法值漫、回收機制與總結(jié) ---JVM


JVM.png

一伯诬、垃圾回收算法

1.標記清除

標記--清除算法將垃圾回收分為兩個階段:標記階段和清除階段晚唇。

在標記階段首先通過根節(jié)點(GC Roots),標記所有從根節(jié)點開始的對象盗似,未被標記的對象就是未被引用的垃圾對象哩陕。然后,在清除階段赫舒,清除所有未被標記的對象悍及。如下圖

[圖片上傳失敗...(image-601690-1618061506012)]

適用場景:

  • 對于存活對象較多的情況下比較高效
  • 適用于年老代(即舊生代)

缺點:

  • 容易產(chǎn)生內(nèi)存碎片,再來一個比較大的對象時(典型情況:該對象的大小大于空閑表中的每一塊兒大小但是小于其中兩塊兒的和)接癌,會提前觸發(fā)垃圾回收
  • 掃描了整個空間兩次(第一次:標記存活對象心赶;第二次:清除沒有標記的對象)

2.復制算法

從根集合節(jié)點進行掃描,標記出所有的存活對象缺猛,并將這些存活的對象復制到一塊兒新的內(nèi)存(圖中下邊的那一塊兒內(nèi)存)上去缨叫,之后將原來的那一塊兒內(nèi)存(圖中上邊的那一塊兒內(nèi)存)全部回收掉

[圖片上傳失敗...(image-9bc14e-1618061506011)]

現(xiàn)在很多的的商業(yè)虛擬機都采用這種收集算法來回收新生代。

適用場合:

  • 存活對象較少的情況下比較高效
  • 掃描了整個空間一次(標記存活對象并復制移動)
  • 適用于年輕代(即新生代):基本上98%的對象是"朝生夕死"的荔燎,存活下來的會很少

缺點:

  • 需要一塊兒空的內(nèi)存空間
  • 需要復制移動對象

3.標記整理

復制算法的高效性是建立在存活對象少耻姥、垃圾對象多的前提下的。

這種情況在新生代經(jīng)常發(fā)生有咨,但是在老年代更常見的情況是大部分對象都是存活對象琐簇。如果依然使用復制算法,由于存活的對象較多摔吏,復制的成本也將很高鸽嫂。

[圖片上傳失敗...(image-ee4c8c-1618061506011)]

標記-壓縮算法是一種老年代的回收算法纵装,它在標記-清除算法的基礎上做了一些優(yōu)化。

首先也需要從根節(jié)點開始對所有可達對象做一次標記据某,但之后橡娄,它并不簡單地清理未標記的對象,而是將所有的存活對象壓縮到內(nèi)存的一端癣籽。之后挽唉,清理邊界外所有的空間。這種方法既避免了碎片的產(chǎn)生筷狼,又不需要兩塊相同的內(nèi)存空間瓶籽,因此,其性價比比較高埂材。

4.分代收集算法

分代收集算法就是目前虛擬機使用的回收算法塑顺,它解決了標記整理不適用于老年代的問題,將內(nèi)存分為各個年代俏险。一般情況下將堆區(qū)劃分為老年代(Tenured Generation)和新生代(Young Generation)严拒,在堆區(qū)之外還有一個代就是永久代(Permanet Generation)。

在不同年代使用不同的算法竖独,從而使用最合適的算法裤唠,新生代存活率低,可以使用復制算法莹痢。而老年代對象存活率搞种蘸,沒有額外空間對它進行分配擔保,所以只能使用標記清除或者標記整理算法竞膳。

二航瞭、垃圾回收機制

jvm內(nèi)存結(jié)構(gòu)

1)新產(chǎn)生的對象優(yōu)先分配在Eden區(qū)(除非配置了-XX:PretenureSizeThreshold,大于該值的對象會直接進入年老代)顶猜;

2)當Eden區(qū)滿了或放不下了沧奴,這時候其中存活的對象會復制到from區(qū)。

這里长窄,需要注意的是滔吠,如果存活下來的對象from區(qū)都放不下,則這些存活下來的對象全部進入年老代挠日。之后Eden區(qū)的內(nèi)存全部回收掉疮绷。

3)之后產(chǎn)生的對象繼續(xù)分配在Eden區(qū),當Eden區(qū)又滿了或放不下了嚣潜,這時候?qū)袳den區(qū)和from區(qū)存活下來的對象復制到to區(qū)(同理冬骚,如果存活下來的對象to區(qū)都放不下,則這些存活下來的對象全部進入年老代),之后回收掉Eden區(qū)和from區(qū)的所有內(nèi)存只冻。

4)如上這樣庇麦,會有很多對象會被復制很多次(每復制一次,對象的年齡就+1)喜德,默認情況下山橄,當對象被復制了15次(這個次數(shù)可以通過:-XX:MaxTenuringThreshold來配置),就會進入年老代了舍悯。

5)當年老代滿了或者存放不下將要進入年老代的存活對象的時候航棱,就會發(fā)生一次Full GC(這個是我們最需要減少的,因為耗時很嚴重)萌衬。

垃圾回收有兩種類型:Minor GC 和 Full GC饮醇。

1.Minor GC

對新生代進行回收,不會影響到年老代秕豫。因為新生代的 Java 對象大多死亡頻繁朴艰,所以 Minor GC 非常頻繁,一般在這里使用速度快馁蒂、效率高的算法呵晚,使垃圾回收能盡快完成。

2.Full GC

也叫 Major GC沫屡,對整個堆進行回收,包括新生代和老年代撮珠。由于Full GC需要對整個堆進行回收沮脖,所以比Minor GC要慢,因此應該盡可能減少Full GC的次數(shù)芯急,導致Full GC的原因包括:老年代被寫滿勺届、永久代(Perm)被寫滿和System.gc()被顯式調(diào)用等。

二娶耍、垃圾回收算法總結(jié)

1.年輕代:復制算法

  1. 所有新生成的對象首先都是放在年輕代的免姿。年輕代的目標就是盡可能快速的收集掉那些生命周期短的對象。

  2. 新生代內(nèi)存按照8:1:1的比例分為一個eden區(qū)和兩個survivor(survivor0,survivor1)區(qū)榕酒。一個Eden區(qū)胚膊,兩個 Survivor區(qū)(一般而言)。大部分對象在Eden區(qū)中生成想鹰∥赏瘢回收時先將eden區(qū)存活對象復制到一個survivor0區(qū),然后清空eden區(qū)辑舷,當這個survivor0區(qū)也存放滿了時喻犁,則將eden區(qū)和survivor0區(qū)存活對象復制到另一個survivor1區(qū),然后清空eden和這個survivor0區(qū),此時survivor0區(qū)是空的肢础,然后將survivor0區(qū)和survivor1區(qū)交換还栓,即保持survivor1區(qū)為空, 如此往復传轰。

  3. 當survivor1區(qū)不足以存放 eden和survivor0的存活對象時剩盒,就將存活對象直接存放到老年代。若是老年代也滿了就會觸發(fā)一次Full GC(Major GC)路召,也就是新生代勃刨、老年代都進行回收。

  4. 新生代發(fā)生的GC也叫做Minor GC股淡,MinorGC發(fā)生頻率比較高(不一定等Eden區(qū)滿了才觸發(fā))身隐。

2.年老代:標記-清除或標記-整理

  1. 在年輕代中經(jīng)歷了N次垃圾回收后仍然存活的對象,就會被放到年老代中唯灵。因此贾铝,可以認為年老代中存放的都是一些生命周期較長的對象。

  2. 內(nèi)存比新生代也大很多(大概比例是1:2)埠帕,當老年代內(nèi)存滿時觸發(fā)Major GC即Full GC垢揩,F(xiàn)ull GC發(fā)生頻率比較低,老年代對象存活時間比較長敛瓷,存活率標記高叁巨。

以上這種年輕代與年老代分別采用不同回收算法的方式稱為"分代收集算法",這也是當下企業(yè)使用的一種方式

3)每一種算法都會有很多不同的垃圾回收器去實現(xiàn)呐籽,在實際使用中锋勺,根據(jù)自己的業(yè)務特點做出選擇就好。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狡蝶,一起剝皮案震驚了整個濱河市庶橱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贪惹,老刑警劉巖苏章,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異奏瞬,居然都是意外死亡枫绅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門丝格,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撑瞧,“玉大人,你說我怎么就攤上這事显蝌≡に牛” “怎么了订咸?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長酬诀。 經(jīng)常有香客問我脏嚷,道長,這世上最難降的妖魔是什么瞒御? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任父叙,我火速辦了婚禮,結(jié)果婚禮上肴裙,老公的妹妹穿的比我還像新娘趾唱。我一直安慰自己,他們只是感情好蜻懦,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布甜癞。 她就那樣靜靜地躺著,像睡著了一般宛乃。 火紅的嫁衣襯著肌膚如雪悠咱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天征炼,我揣著相機與錄音析既,去河邊找鬼。 笑死谆奥,一個胖子當著我的面吹牛眼坏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播酸些,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼空骚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了擂仍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤熬甚,失蹤者是張志新(化名)和其女友劉穎逢渔,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乡括,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡肃廓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了诲泌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盲赊。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖敷扫,靈堂內(nèi)的尸體忽然破棺而出哀蘑,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布绘迁,位于F島的核電站合溺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏缀台。R本人自食惡果不足惜棠赛,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望膛腐。 院中可真熱鬧睛约,春花似錦、人聲如沸哲身。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽律罢。三九已至膀值,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間误辑,已是汗流浹背沧踏。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留巾钉,地道東北人翘狱。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像砰苍,于是被迫代替她去往敵國和親潦匈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

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