這篇文章給大家介紹一文讀懂JVM中的垃圾回收器,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

JVM的GC經(jīng)過多年的發(fā)展,大家對Minor GC、major GC的理解并不完全一致,所以我不打算在本文中使用這個概念。我把GC大概分為一下4類:
因為筆者目前使用G1還是比較少的,所以本文不打算將G1。
垃圾回收器算法
目前主流垃圾回收器都采用的是可達(dá)性分析算法來判斷對象是否已經(jīng)存活,不使用引用計數(shù)算法判斷對象時候存活的原因在于該算法很難解決相互引用的問題。
標(biāo)記-清除算法(Mark-Sweep)
標(biāo)記-清除算法由標(biāo)記階段和清除階段構(gòu)成。標(biāo)記階段是把所有活著的對象都做上標(biāo)記的階段;清除階段是把那些沒有標(biāo)記的對象,也就是非活動對象回收的階段。通過這兩個階段,就可以令不能利用的內(nèi)存空間重新得到利用。
從標(biāo)記-清除算法我們可以看出,該算法不涉及對象移動,但是可能會產(chǎn)生內(nèi)存碎片化問題。空間碎片太高可能會導(dǎo)致程序運行時需要分配較大內(nèi)存時候,無法找到足夠的連續(xù)內(nèi)存,需要其他垃圾回收幫助回收內(nèi)存。
復(fù)制算法(Copying)
復(fù)制算法內(nèi)存空間分為兩塊區(qū)域:From、to,每次只使用其中一塊,在垃圾回收時將正在使用的內(nèi)存中的存活對象復(fù)制到未被使用的內(nèi)存塊中,之后,清除正在使用的內(nèi)存塊中的所有對象,交換兩個內(nèi)存的角色,完成垃圾回收。
上面那種復(fù)制算法有一半的空間是浪費的。所以在Java新生代把內(nèi)存區(qū)域分為Eden空間、from、to空間3個部分,from和to空間也稱為survivor 空間,用于存放未被回收的對象。對象開始都是Eden生成;當(dāng)回收時,將Eden和from中存活的對象移動到to區(qū)域中。
復(fù)制算法存在空間浪費的情況,始終都要保持一個Survivor是空閑的,并且在GC的時候要是存活對象大小超過了Survivor中的大小,就需要另外的策略存儲存活對象。
目前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)記階段完全一樣,壓縮階段是讓所有存活的對象向一端移動。這樣空閑內(nèi)存都在另外一端,屬于連續(xù)空間,不存在內(nèi)存碎片化問題,但是會產(chǎn)生對象移動。
分代算法(Generational GC)
根據(jù)對象的不同生命周期分別管理, JVM 中將對象分為我們熟悉的新生代、老年代和永久代分別管理。這樣做的好處就是可以根據(jù)不同類型對象進(jìn)行不同策略的管理,例如新生代中對象更新速度快,就會使用效率較高的復(fù)制算法。老年代中內(nèi)存空間相對分配較大,而且時效性不如新生代強,就會常常使用Mark-Sweep-Compact (標(biāo)記-清除-壓縮)算法。
各種算法性能比較

常見的垃圾回收器
垃圾回收器分類
總體上可以把Java的垃圾回收器分為3類:
Java垃圾回收器主要有6種,各自優(yōu)缺點以及組合關(guān)系如下:

其中的連線表示young gc和old gc可以搭配使用

垃圾回收器選擇策略:
目前很大一部分的Java應(yīng)用都集中在互聯(lián)網(wǎng)的服務(wù)器端,這類應(yīng)用尤其關(guān)系服務(wù)的響應(yīng)時間,希望應(yīng)用暫停時間更短,所以基本上使用的都是ParNew + CMS,這也是我司默認(rèn)使用的配置。
CMS垃圾回收器
在啟動JVM參數(shù)加上 -XX:+UseConcMarkSweepGC ,這個參數(shù)表示對于老年代的回收采用 CMS。
CMS執(zhí)行過程
CMS 的回收過程主要分為下面的幾個步驟:

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]
新聞名稱:一文讀懂JVM中的垃圾回收器-創(chuàng)新互聯(lián)
URL鏈接:http://www.chinadenli.net/article42/dhddec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、定制網(wǎng)站、網(wǎng)站設(shè)計、網(wǎng)站排名、建站公司、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)