java的垃圾回收#垃圾回收算法

java之所以能夠?qū)崿F(xiàn)自動(dòng)內(nèi)存分配搀愧,是因?yàn)閖vm幫我們完成了兩件事

  • 幫助對(duì)象分配內(nèi)存
  • 幫助回收分配給對(duì)象的內(nèi)存

回收哪些地方的內(nèi)存

jvm內(nèi)存分類(lèi)可見(jiàn)下圖
線程私有的內(nèi)存占用在程序編譯期就是可知的需五,堆和方法區(qū)的內(nèi)存是在程序運(yùn)行期才能確定,GC負(fù)責(zé)處理的就是線程共享的內(nèi)存: 方法區(qū)

Paste_Image.png

對(duì)象已死么

應(yīng)該回收哪些對(duì)象占用的內(nèi)存呢,需要找出“死掉”的對(duì)象,兩種方法可以找到

  • 引用計(jì)數(shù)法
    由于引用計(jì)數(shù)法容易造成兩個(gè)對(duì)象相互循環(huán)引用問(wèn)題,主流jvm并不采用該方法
  • 可達(dá)性分析 主流jvm采用的方法
    如下圖攀隔,那些無(wú)法到達(dá)GC Roots的對(duì)象皂贩,就是可以被回收的對(duì)象
Paste_Image.png

GCRoots中的對(duì)象包括

  1. 虛擬機(jī)棧中(局部變量表)引用的對(duì)象
  2. 方法區(qū)中類(lèi)的靜態(tài)屬性引用的對(duì)象
  3. 方法區(qū)中常量引用的對(duì)象
  4. JNI中引用的對(duì)象

那些發(fā)現(xiàn)不能到達(dá)GC Roots的對(duì)象并不會(huì)立即回收,在真正回收之前竞慢,對(duì)象至少要被標(biāo)記兩次先紫。當(dāng)?shù)谝淮伪话l(fā)現(xiàn)不可達(dá)時(shí),該對(duì)象會(huì)被標(biāo)記一次筹煮,同時(shí)調(diào)用此對(duì)象的finalize()方法(如果有);在第二次被發(fā)現(xiàn)不可達(dá)后居夹,對(duì)象被回收败潦。
利用finalisze()方法,對(duì)象可以逃離一次被回收的命運(yùn)准脂,但是只有一次劫扒。逃命方法如下,需要在finalize()方法中給自己加一個(gè)GCRoots中的hook

<pre>
public class EscapeFromGC(){
public static EscapeFromGC hook;
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("finalize mehtod executed!");
EscapeFromGC.hook = this;
}
</pre>

垃圾回收算法

  1. 標(biāo)記清除(Mark Sweep)算法


    Paste_Image.png

    顧名思義狸膏,此方法有兩個(gè)階段沟饥,標(biāo)記需要清除的對(duì)象,然后清除湾戳。
    有兩個(gè)問(wèn)題

    • 效率低
    • 會(huì)產(chǎn)生很多不連續(xù)內(nèi)存贤旷,分配大對(duì)象時(shí),容易提前引起另一次垃圾回收
  2. 復(fù)制算法(Copying)
    考慮將內(nèi)存分成兩個(gè)一樣大的區(qū)域砾脑,一邊的內(nèi)存用完了幼驶,就把所用存活的對(duì)象放到另一邊內(nèi)存

    • 效率高,每次針對(duì)某一片內(nèi)存進(jìn)行內(nèi)存回收韧衣,不用考慮內(nèi)存碎片化
    • 有一定空間浪費(fèi)


      Paste_Image.png

      實(shí)際上盅藻,98%的新時(shí)代對(duì)象都是很快要被回收的,所以實(shí)際jvm并不會(huì)按照1:1來(lái)分配內(nèi)存畅铭。而是將內(nèi)存分為一塊較大的Eden區(qū)和兩塊較小的Survival區(qū)氏淑,默認(rèn)比例為8:1:1,這樣實(shí)際上新時(shí)代的可用內(nèi)存為實(shí)際內(nèi)存的90%硕噩。

  3. 標(biāo)記整理(Mark Compact)算法


    Paste_Image.png

    根據(jù)老年代的特點(diǎn)(大部分對(duì)象的存活周期長(zhǎng)假残,需要盡可能利用內(nèi)存)
    第一步和標(biāo)記清除算法的標(biāo)記一樣,但是第二步不是清除榴徐,而是讓內(nèi)存一次往前移動(dòng)守问,占滿空閑內(nèi)存。

  4. 分代(Generational )收集
    現(xiàn)代商業(yè)系統(tǒng)采用分帶收集算法坑资,根據(jù)對(duì)象的生存周期把內(nèi)存分為新生代和老生代耗帕。

  • 新生代采用復(fù)制算法
  • 老生代采用標(biāo)記整理算法

垃圾收集器

垃圾收集器的發(fā)展方向,就是朝著更高效率發(fā)展袱贮。具體在減少GC的時(shí)間
下圖是常用的垃圾收集器仿便,連線表示在新生代和老生代可以一起配合工作的組合

Paste_Image.png

內(nèi)存分配的幾個(gè)原則

  1. 對(duì)象優(yōu)先在Eden區(qū)域分配
  2. 大對(duì)象直接進(jìn)入老年代
  3. 長(zhǎng)期存活對(duì)象進(jìn)入老年代
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嗽仪,更是在濱河造成了極大的恐慌荒勇,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闻坚,死亡現(xiàn)場(chǎng)離奇詭異沽翔,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)窿凤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)仅偎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人雳殊,你說(shuō)我怎么就攤上這事橘沥。” “怎么了夯秃?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵座咆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我仓洼,道長(zhǎng)介陶,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任衬潦,我火速辦了婚禮斤蔓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘镀岛。我一直安慰自己弦牡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布漂羊。 她就那樣靜靜地躺著驾锰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪走越。 梳的紋絲不亂的頭發(fā)上椭豫,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音旨指,去河邊找鬼赏酥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛谆构,可吹牛的內(nèi)容都是我干的裸扶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼搬素,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼呵晨!你這毒婦竟也來(lái)了魏保?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤摸屠,失蹤者是張志新(化名)和其女友劉穎谓罗,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體季二,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡檩咱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了胯舷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片税手。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖需纳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情艺挪,我是刑警寧澤不翩,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站麻裳,受9級(jí)特大地震影響口蝠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜津坑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一妙蔗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疆瑰,春花似錦眉反、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至耿币,卻和暖如春梳杏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背淹接。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工十性, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人塑悼。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓劲适,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親拢肆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子减响,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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