這篇文章給大家介紹一文讀懂JVM中的垃圾回收器,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
JVM的GC經(jīng)過(guò)多年的發(fā)展,大家對(duì)Minor GC、major GC的理解并不完全一致,所以我不打算在本文中使用這個(gè)概念。我把GC大概分為一下4類(lèi):
因?yàn)楣P者目前使用G1還是比較少的,所以本文不打算將G1。
垃圾回收器算法
目前主流垃圾回收器都采用的是可達(dá)性分析算法來(lái)判斷對(duì)象是否已經(jīng)存活,不使用引用計(jì)數(shù)算法判斷對(duì)象時(shí)候存活的原因在于該算法很難解決相互引用的問(wèn)題。
標(biāo)記-清除算法(Mark-Sweep)
標(biāo)記-清除算法由標(biāo)記階段和清除階段構(gòu)成。標(biāo)記階段是把所有活著的對(duì)象都做上標(biāo)記的階段;清除階段是把那些沒(méi)有標(biāo)記的對(duì)象,也就是非活動(dòng)對(duì)象回收的階段。通過(guò)這兩個(gè)階段,就可以令不能利用的內(nèi)存空間重新得到利用。
從標(biāo)記-清除算法我們可以看出,該算法不涉及對(duì)象移動(dòng),但是可能會(huì)產(chǎn)生內(nèi)存碎片化問(wèn)題。空間碎片太高可能會(huì)導(dǎo)致程序運(yùn)行時(shí)需要分配較大內(nèi)存時(shí)候,無(wú)法找到足夠的連續(xù)內(nèi)存,需要其他垃圾回收幫助回收內(nèi)存。
復(fù)制算法(Copying)
復(fù)制算法內(nèi)存空間分為兩塊區(qū)域:From、to,每次只使用其中一塊,在垃圾回收時(shí)將正在使用的內(nèi)存中的存活對(duì)象復(fù)制到未被使用的內(nèi)存塊中,之后,清除正在使用的內(nèi)存塊中的所有對(duì)象,交換兩個(gè)內(nèi)存的角色,完成垃圾回收。
上面那種復(fù)制算法有一半的空間是浪費(fèi)的。所以在Java新生代把內(nèi)存區(qū)域分為Eden空間、from、to空間3個(gè)部分,from和to空間也稱(chēng)為survivor 空間,用于存放未被回收的對(duì)象。對(duì)象開(kāi)始都是Eden生成;當(dāng)回收時(shí),將Eden和from中存活的對(duì)象移動(dòng)到to區(qū)域中。
復(fù)制算法存在空間浪費(fèi)的情況,始終都要保持一個(gè)Survivor是空閑的,并且在GC的時(shí)候要是存活對(duì)象大小超過(guò)了Survivor中的大小,就需要另外的策略存儲(chǔ)存活對(duì)象。
目前open JDK新生代回收策略就是采用的復(fù)制算法,其中Eden和Survivor的默認(rèn)配置為8:1
標(biāo)記-壓縮算法(Mark-Compact)
標(biāo)記-壓縮算法由標(biāo)記階段和壓縮階段構(gòu)成。標(biāo)記階段標(biāo)記-清除算法中的標(biāo)記階段完全一樣,壓縮階段是讓所有存活的對(duì)象向一端移動(dòng)。這樣空閑內(nèi)存都在另外一端,屬于連續(xù)空間,不存在內(nèi)存碎片化問(wèn)題,但是會(huì)產(chǎn)生對(duì)象移動(dòng)。
分代算法(Generational GC)
根據(jù)對(duì)象的不同生命周期分別管理, JVM 中將對(duì)象分為我們熟悉的新生代、老年代和永久代分別管理。這樣做的好處就是可以根據(jù)不同類(lèi)型對(duì)象進(jìn)行不同策略的管理,例如新生代中對(duì)象更新速度快,就會(huì)使用效率較高的復(fù)制算法。老年代中內(nèi)存空間相對(duì)分配較大,而且時(shí)效性不如新生代強(qiáng),就會(huì)常常使用Mark-Sweep-Compact (標(biāo)記-清除-壓縮)算法。
各種算法性能比較
常見(jiàn)的垃圾回收器
垃圾回收器分類(lèi)
總體上可以把Java的垃圾回收器分為3類(lèi):
Java垃圾回收器主要有6種,各自?xún)?yōu)缺點(diǎn)以及組合關(guān)系如下:
其中的連線表示young gc和old gc可以搭配使用
垃圾回收器選擇策略:
目前很大一部分的Java應(yīng)用都集中在互聯(lián)網(wǎng)的服務(wù)器端,這類(lèi)應(yīng)用尤其關(guān)系服務(wù)的響應(yīng)時(shí)間,希望應(yīng)用暫停時(shí)間更短,所以基本上使用的都是ParNew + CMS,這也是我司默認(rèn)使用的配置。
CMS垃圾回收器
在啟動(dòng)JVM參數(shù)加上 -XX:+UseConcMarkSweepGC ,這個(gè)參數(shù)表示對(duì)于老年代的回收采用 CMS。
CMS執(zhí)行過(guò)程
CMS 的回收過(guò)程主要分為下面的幾個(gè)步驟:
CMS日志解析
標(biāo)準(zhǔn)的CMS日志如下:
2018-11-10T18:23:27.531+0800: 1495270.652: [GC (CMS Initial Mark) [1 CMS-initial-mark: 2008820K(2510848K)] 2038212K(4398336K), 0.0231086 secs] [Times: user=0.01 sys=0.00, real=0.03 secs] 2018-11-10T18:23:27.554+0800: 1495270.675: [CMS-concurrent-mark-start] 2018-11-10T18:23:27.644+0800: 1495270.765: [CMS-concurrent-mark: 0.090/0.090 secs] [Times: user=0.34 sys=0.03, real=0.09 secs] 2018-11-10T18:23:27.644+0800: 1495270.765: [CMS-concurrent-preclean-start] 2018-11-10T18:23:27.654+0800: 1495270.775: [CMS-concurrent-preclean: 0.010/0.010 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 2018-11-10T18:23:27.655+0800: 1495270.775: [CMS-concurrent-abortable-preclean-start] 2018-11-10T18:23:32.305+0800: 1495275.425: [CMS-concurrent-abortable-preclean: 4.623/4.650 secs] [Times: user=7.01 sys=1.01, real=4.65 secs] 2018-11-10T18:23:32.307+0800: 1495275.427: [GC (CMS Final Remark) [YG occupancy: 847369 K (1887488 K)]1495275.427: [Rescan (parallel) , 0.0902177 secs]1495275.518: [weak refs processing, 0.0514433 secs]1495275.569: [class unloading, 0.0256119 secs]1495275.595: [scrub symbol table, 0.0074695 secs]1495275.602: [scrub string table, 0.0015014 secs][1 CMS-remark: 2008820K(2510848K)] 2856190K(4398336K), 0.1806988 secs] [Times: user=0.68 sys=0.00, real=0.18 secs] 2018-11-10T18:23:32.488+0800: 1495275.609: [CMS-concurrent-sweep-start] 2018-11-10T18:23:33.660+0800: 1495276.781: [CMS-concurrent-sweep: 1.172/1.172 secs] [Times: user=1.89 sys=0.24, real=1.17 secs] 2018-11-10T18:23:33.661+0800: 1495276.782: [CMS-concurrent-reset-start] 2018-11-10T18:23:33.667+0800: 1495276.788: [CMS-concurrent-reset: 0.006/0.006 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
新聞名稱(chēng):一文讀懂JVM中的垃圾回收器-創(chuàng)新互聯(lián)
URL鏈接:http://jinyejixie.com/article42/dhddec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、定制網(wǎng)站、網(wǎng)站設(shè)計(jì)、網(wǎng)站排名、建站公司、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容