JVM 學(xué)習(xí)之垃圾回收

什么是“垃圾”管宵?

對(duì)我們已經(jīng)沒(méi)有使用價(jià)值的東西就稱為“垃圾”前痘。在 JVM 中無(wú)用的對(duì)象就稱為“垃圾”,因?yàn)樗加昧宋覀儗氋F的內(nèi)存資源坎拐。

哪里有“垃圾”烦磁?

前面我們已經(jīng)了解過(guò)了 JVM 的內(nèi)存,現(xiàn)在復(fù)習(xí)一下哼勇。我們知道程序計(jì)數(shù)器都伪、虛擬機(jī)棧、本地方法棧都是線程私有的积担,這幾個(gè)區(qū)域隨著線程消亡而消亡陨晶,可以達(dá)到自動(dòng)清理的效果。Java 堆帝璧、方法區(qū)則是共享區(qū)域先誉,各種對(duì)象的實(shí)例保存在 Java 堆中。所以這兩個(gè)區(qū)域會(huì)出現(xiàn)“垃圾”

誰(shuí)是“垃圾”的烁?

怎么確定誰(shuí)是垃圾褐耳,這里提供了兩種算法,分別是:引用計(jì)數(shù)算法撮躁、可達(dá)性分析算法

引用計(jì)數(shù)算法

引用計(jì)數(shù)算法的思路是這樣的:

每當(dāng)有一個(gè)地方引用它時(shí)漱病,計(jì)數(shù)器的值就加 1;當(dāng)引用失效的時(shí)候把曼,計(jì)數(shù)器就減 1杨帽。任何時(shí)刻計(jì)數(shù)器為 0 的對(duì)象就是不可能被再次使用的。

這種方法效率高嗤军,但是會(huì)出現(xiàn)無(wú)法回收的情況注盈,請(qǐng)看下面的代碼:

public class Main {
    public static void main(String[] args) {
        MyObject object1 = new MyObject();
        MyObject object2 = new MyObject();
 
        object1.object = object2;
        object2.object = object1;
 
        object1 = null;
        object2 = null;
    }
}
 
class MyObject{
    public Object object = null;
}

這兩個(gè)對(duì)象已經(jīng)不可能再被訪問(wèn)了,但是因?yàn)樗麄冞€互相引用著對(duì)方叙赚,導(dǎo)致引用計(jì)數(shù)都不為 0老客,垃圾回收器無(wú)法回收他們僚饭。

可達(dá)性分析算法

這個(gè)算法的基本思路是:通過(guò)一系列的稱為 “GC Roots” 的對(duì)象作為起點(diǎn),從這些節(jié)點(diǎn)開(kāi)向下搜搜胧砰,搜索所走過(guò)的路徑稱為引用鏈鳍鸵,當(dāng)一個(gè)對(duì)象到 GC Roots 沒(méi)有任何引用鏈相連的時(shí)候就說(shuō)明對(duì)象是不可用的。

垃圾回收算法

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

這是最基礎(chǔ)的垃圾回收算法尉间,思想簡(jiǎn)單偿乖,這個(gè)算法分為兩個(gè)階段,一個(gè)是“標(biāo)記”哲嘲,一個(gè)是“清除”贪薪。

算法大致思路:

標(biāo)記出所有需要回收的對(duì)象,在標(biāo)記完成之后統(tǒng)一回收所有被標(biāo)記的對(duì)象

缺點(diǎn):效率低眠副,標(biāo)記和清除的效率都不高画切;標(biāo)記清除之后會(huì)產(chǎn)生大量不連續(xù)的內(nèi)存碎片。

復(fù)制(Copying)算法

這個(gè)算法實(shí)現(xiàn)簡(jiǎn)單囱怕、高效霍弹、不容易產(chǎn)生碎片,但是將可用內(nèi)存縮小為原來(lái)內(nèi)存的一半娃弓,來(lái)看看這個(gè)算法是什么思路:

將可用內(nèi)存按容量分為大小相等的兩塊庞萍,每次使用其中的一塊,當(dāng)這塊內(nèi)存用完了忘闻,就將還存活著的對(duì)象復(fù)制到另外一塊內(nèi)存上面,然后把這塊已經(jīng)使用的內(nèi)存一次性清理掉恋博。簡(jiǎn)單粗暴齐佳。

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

算法標(biāo)記階段和Mark-Sweep一樣,但是在完成標(biāo)記之后债沮,它不是直接清理可回收對(duì)象炼吴,而是將存活對(duì)象都向一端移動(dòng),然后清理掉端邊界以外的內(nèi)存

分代收集算法

分代收集算法是目前大部分JVM的垃圾收集器采用的算法疫衩。根據(jù)對(duì)象存活的生命周期將內(nèi)存劃分為若干個(gè)不同的區(qū)域硅蹦。一般情況下將堆區(qū)劃分為老年代(Tenured Generation)和新生代(Young Generation),老年代的特點(diǎn)是每次垃圾收集時(shí)只有少量對(duì)象需要被回收闷煤,而新生代的特點(diǎn)是每次垃圾回收時(shí)都有大量的對(duì)象需要被回收童芹,那么就可以根據(jù)不同代的特點(diǎn)采取最適合的收集算法。

內(nèi)存分配與回收策略

我們知道鲤拿,對(duì)象的分配就是在 Java 堆上分配假褪,對(duì)象主要分配在新生代 Eden 區(qū)上,也可能分配在別的區(qū)域上(可設(shè)置內(nèi)存相關(guān)參數(shù))近顷。

對(duì)象優(yōu)先分配在 Eden

大多數(shù)情況下生音,對(duì)象在新生代 Eden 區(qū)域中分配宁否。如果 Eden 區(qū)域沒(méi)有足夠的空間分配的時(shí)候,就會(huì)觸發(fā) Minor GC

大對(duì)象直接進(jìn)入老年代

什么樣的對(duì)象稱為大對(duì)象缀遍?所謂的大對(duì)象是指需要大量連續(xù)內(nèi)存空間的 Java 對(duì)象慕匠,典型的大對(duì)象就是那種很長(zhǎng)的字符串以及數(shù)組。

長(zhǎng)期存活的對(duì)象將進(jìn)入老年代

虛擬機(jī)需要解決哪些對(duì)象放在新生代域醇,哪些對(duì)象應(yīng)該放在老年代的問(wèn)題台谊。為了解決這個(gè)問(wèn)題,虛擬機(jī)給對(duì)象定義了一個(gè)對(duì)象年齡的計(jì)數(shù)器歹苦。如果對(duì)象在 Eden 出生并且第一次 Minor GC 后仍然存活青伤,并且能被 Survivor 容納的話,將被移動(dòng)到 Survivor 空間中殴瘦,并且將對(duì)象的年齡設(shè)置為 1狠角。如果這個(gè)對(duì)象在 Survivor 空間中能夠熬過(guò) Minor GC,年齡再增加 1 歲蚪腋,當(dāng)年齡增加到一定程度時(shí)(默認(rèn)為 15 歲)丰歌,就會(huì)晉升到老年代。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末屉凯,一起剝皮案震驚了整個(gè)濱河市立帖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌悠砚,老刑警劉巖晓勇,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異灌旧,居然都是意外死亡绑咱,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門(mén)枢泰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)描融,“玉大人,你說(shuō)我怎么就攤上這事衡蚂×耍” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵毛甲,是天一觀的道長(zhǎng)年叮。 經(jīng)常有香客問(wèn)我,道長(zhǎng)玻募,這世上最難降的妖魔是什么谋右? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮补箍,結(jié)果婚禮上改执,老公的妹妹穿的比我還像新娘啸蜜。我一直安慰自己,他們只是感情好辈挂,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布衬横。 她就那樣靜靜地躺著,像睡著了一般终蒂。 火紅的嫁衣襯著肌膚如雪蜂林。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天拇泣,我揣著相機(jī)與錄音噪叙,去河邊找鬼。 笑死霉翔,一個(gè)胖子當(dāng)著我的面吹牛睁蕾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播债朵,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼子眶,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了序芦?” 一聲冷哼從身側(cè)響起臭杰,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谚中,沒(méi)想到半個(gè)月后渴杆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宪塔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年将塑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝌麸。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖艾疟,靈堂內(nèi)的尸體忽然破棺而出来吩,到底是詐尸還是另有隱情,我是刑警寧澤蔽莱,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布弟疆,位于F島的核電站,受9級(jí)特大地震影響盗冷,放射性物質(zhì)發(fā)生泄漏怠苔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一仪糖、第九天 我趴在偏房一處隱蔽的房頂上張望柑司。 院中可真熱鬧迫肖,春花似錦、人聲如沸攒驰。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)玻粪。三九已至隅津,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間劲室,已是汗流浹背伦仍。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留很洋,地道東北人充蓝。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蹲缠,于是被迫代替她去往敵國(guó)和親棺克。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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