日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

圖解 Java 垃圾回收機(jī)制,寫(xiě)得非常好!

 鷹兔牛熊眼 2019-08-17

20大進(jìn)階架構(gòu)專題每日送達(dá)

原文:https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

譯文:https://www.oschina.net/translate/java-gc

翻譯:Rhys_Lee, AzureSora, 溪邊九節(jié), 小小菜鳥(niǎo)雞

什么是自動(dòng)垃圾回收?

自動(dòng)垃圾回收是一種在堆內(nèi)存中找出哪些對(duì)象在被使用,還有哪些對(duì)象沒(méi)被使用,并且將后者刪掉的機(jī)制。

所謂使用中的對(duì)象(已引用對(duì)象),指的是程序中有指針指向的對(duì)象;而未使用中的對(duì)象(未引用對(duì)象),則沒(méi)有被任何指針給指向,因此占用的內(nèi)存也可以被回收掉。

在用 C 之類的編程語(yǔ)言時(shí),程序員需要自己手動(dòng)分配和釋放內(nèi)存。而 Java 不一樣,它有垃圾回收器,釋放內(nèi)存由回收器負(fù)責(zé)。本文接下來(lái)將介紹垃圾回收機(jī)制的基本過(guò)程。

第一步:標(biāo)記

垃圾回收的第一步是標(biāo)記。垃圾回收器此時(shí)會(huì)找出哪些內(nèi)存在使用中,還有哪些不是。

上圖中,藍(lán)色表示已引用對(duì)象,橙色表示未引用對(duì)象。垃圾回收器要檢查完所有的對(duì)象,才能知道哪些有被引用,哪些沒(méi)。如果系統(tǒng)里所有的對(duì)象都要檢查,那這一步可能會(huì)相當(dāng)耗時(shí)間。關(guān)注Java技術(shù)棧微信公眾號(hào),回復(fù):JVM46,可以獲取一份超全 JVM 調(diào)優(yōu)攻略。

第二步:清除

這一步會(huì)刪掉標(biāo)記出的未引用對(duì)象。

內(nèi)存分配器會(huì)保留指向可用內(nèi)存的引用,以供分配新對(duì)象。

壓縮

為了提升性能,刪除了未引用對(duì)象后,還可以將剩下的已引用對(duì)象放在一起(壓縮),這樣就能更簡(jiǎn)單快捷地分配新對(duì)象了。

為什么需要分代垃圾收集?

之前說(shuō)過(guò),逐一標(biāo)記和壓縮 Java 虛擬機(jī)里的所有對(duì)象非常低效:分配的對(duì)象越多,垃圾回收需時(shí)就越久。不過(guò),根據(jù)統(tǒng)計(jì),大部分的對(duì)象,其實(shí)用沒(méi)多久就不用了。

來(lái)看個(gè)例子吧。(下圖中,豎軸代表已分配的字節(jié),而橫軸代表程序運(yùn)行時(shí)間)

上圖可見(jiàn),存活(沒(méi)被釋放)的對(duì)象隨運(yùn)行時(shí)間越來(lái)越少。而圖中左側(cè)的那些峰值,也表明了大部分對(duì)象其實(shí)都挺短命的。

JVM 分代

根據(jù)之前的規(guī)律,就可以用來(lái)提升 JVM 的效率了。方法是,把堆分成幾個(gè)部分(就是所謂的分代),分別是新生代、老年代,以及永生代。

新對(duì)象會(huì)被分配在新生代內(nèi)存。一旦新生代內(nèi)存滿了,就會(huì)開(kāi)始對(duì)死掉的對(duì)象,進(jìn)行所謂的小型垃圾回收過(guò)程。一片新生代內(nèi)存里,死掉的越多,回收過(guò)程就越快;至于那些還活著的對(duì)象,此時(shí)就會(huì)老化,并最終老到進(jìn)入老年代內(nèi)存。

Stop the World 事件 —— 小型垃圾回收屬于一種叫 'Stop the World' 的事件。在這種事件發(fā)生時(shí),所有的程序線程都要暫停,直到事件完成(比如這里就是完成了所有回收工作)為止。

老年代用來(lái)保存長(zhǎng)時(shí)間存活的對(duì)象。通常,設(shè)置一個(gè)閾值,當(dāng)達(dá)到該年齡時(shí),年輕代對(duì)象會(huì)被移動(dòng)到老年代。最終老年代也會(huì)被回收。這個(gè)事件成為 Major GC。

Major GC 也會(huì)觸發(fā)STW(Stop the World)。通常,Major GC會(huì)慢很多,因?yàn)樗婕暗剿写婊顚?duì)象。所以,對(duì)于響應(yīng)性的應(yīng)用程序,應(yīng)該盡量避免Major GC。還要注意,Major GC的STW的時(shí)長(zhǎng)受年老代垃圾回收器類型的影響。

永久代包含JVM用于描述應(yīng)用程序中類和方法的元數(shù)據(jù)。永久代是由JVM在運(yùn)行時(shí)根據(jù)應(yīng)用程序使用的類來(lái)填充的。此外,Java SE類庫(kù)和方法也存儲(chǔ)在這里。

如果JVM發(fā)現(xiàn)某些類不再需要,并且其他類可能需要空間,則這些類可能會(huì)被回收。

世代垃圾收集過(guò)程

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多