【51CTO精選譯文】G1垃圾回收器(簡(jiǎn)稱G1 GC)是JDK 7中Java HotSpot VM新引入的垃圾回收器,Java SE 6 Update 14中已經(jīng)包含了一個(gè)G1的體驗(yàn)版本(據(jù)51CTO之前的報(bào)導(dǎo),在Java SE 6 u14于6月初登場(chǎng)時(shí),原本Sun的聲明是:G1垃圾回收器需要收費(fèi)方能使用。然而之后不久,Sun表示這是一個(gè)誤會(huì),修改了原本的發(fā)布聲明,并表示現(xiàn)在以及將來(lái)對(duì)G1的使用都是完全免費(fèi)的),G1是設(shè)計(jì)用于替代HotSpot低延遲的并行標(biāo)記/清除垃圾回收器(也叫做CMS)的。
Java 7 G1屬性
G1是一個(gè)服務(wù)端垃圾回收器,有以下屬性:
◆并行和并發(fā)性:G1利用了當(dāng)今硬件中存在的并行性,當(dāng)Java應(yīng)用程序的線程被停止時(shí),它使用所有可用的CPU(核心,硬件線程等)加速其停止,在停止過(guò)程中運(yùn)行Java線程最小化整個(gè)堆棧。
◆代:和其他HotSpot GC一樣,G1是一代,意味著它在處理新分配的對(duì)象(年輕代)和已經(jīng)生存了一段時(shí)間的對(duì)象(年老代)時(shí)會(huì)不同,它主要集中于新對(duì)象上的垃圾回收活動(dòng),因?yàn)樗鼈兪亲羁赡芑厥盏模f對(duì)象只是偶爾訪問(wèn)一下,對(duì)于大多數(shù)Java應(yīng)用程序,代的垃圾回收對(duì)于替代方案具有重要優(yōu)勢(shì)。
◆壓縮:和CMS不同,G1會(huì)隨時(shí)間推移對(duì)堆棧進(jìn)行壓縮,壓縮消除了潛在的碎片問(wèn)題,確保長(zhǎng)時(shí)間運(yùn)行的操作流暢和一致。
◆可預(yù)測(cè)性:G1比CMS預(yù)測(cè)性更佳,這都是由于消除了碎片問(wèn)題帶來(lái)的好處,再也沒(méi)有CMS中停止期間出現(xiàn)的負(fù)面影響,另外,G1有一個(gè)暫停預(yù)測(cè)模型,允許它滿足(或很少超過(guò))暫停時(shí)間目標(biāo)。
Java 7 G1描述
和其它HotSpot GC相比,G1采用了一個(gè)非常不同的堆棧布局方法,在G1中,年輕代和年老代之間沒(méi)有物理隔離,相反,它們之間有一個(gè)連續(xù)的堆棧,被分成大小一樣的區(qū)域(region),年輕代可能是一套非連續(xù)的區(qū)域,年老代也一樣,這就允許G1在年輕代和年老代之間靈活地移動(dòng)資源。
G1中的回收是通過(guò)消除暫停發(fā)生的,在此期間,幸存者指的是回收集被轉(zhuǎn)移到另一個(gè)區(qū)域,以便回收區(qū)域可以再生,消除暫停是并行的,所有可用的CPU都會(huì)參加,大多數(shù)消除暫停收集可用的年輕區(qū)域,和其它HotSpot GC中的年輕回收是一樣的,在暫停期間偶爾也會(huì)選擇年老區(qū)域回收,因?yàn)镚1在年輕一代回收上還肩負(fù)了年老代的回收活動(dòng)。
和CMS相同的是,G1會(huì)定期執(zhí)行一個(gè)并發(fā)標(biāo)記暫停,這個(gè)階段的主要職責(zé)是識(shí)別哪一個(gè)年老區(qū)域的垃圾對(duì)象是最完整的,因?yàn)檫@些是最有效和最值得回收的,和CMS不同的是,G1不會(huì)執(zhí)行并發(fā)清除暫停,相反,最有用的年老區(qū)域是通過(guò)并發(fā)標(biāo)記暫停標(biāo)識(shí)的,在隨后的消除暫停期間進(jìn)行回收。
使用G1
G1仍然被看做是試驗(yàn)品,可以使用下面兩個(gè)參數(shù)開(kāi)啟它:
-XX:+UnlockExperimentalVMOptions -XX:+UseG1GC
為了設(shè)置一個(gè)GC暫停時(shí)間目標(biāo),使用下面的參數(shù):
-XX:MaxGCPauseMillis =50 (暫停時(shí)間目標(biāo)50ms)
使用G1時(shí)還可以指定時(shí)間間隔,當(dāng)GC暫停持續(xù)時(shí)間沒(méi)有上面給出的時(shí)間長(zhǎng)時(shí)可以這么用:
-XX:GCPauseIntervalMillis =200 (暫停間隔目標(biāo)200ms)
注意上面兩個(gè)選項(xiàng)表示的目標(biāo),沒(méi)有承諾和保證,在某些情況下它們可能能夠工作,GC不是總是能夠執(zhí)行它們。
另外,年輕代的大小可以明確指定影響消除暫停時(shí)間:
-XX:+G1YoungGenSize=512m (年輕代大小512M)
G1也使用幸存空間(可能是非連續(xù)的區(qū)域),它們的大小可以使用一個(gè)常見(jiàn)的參數(shù)指定,如:
-XX:SurvivorRatio=6
最后,為了運(yùn)行G1充分發(fā)揮其潛力,嘗試設(shè)置以下兩個(gè)默認(rèn)被禁用了的參數(shù),因?yàn)樗鼈兛赡軙?huì)暴露一個(gè)罕見(jiàn)的競(jìng)爭(zhēng)狀態(tài):
-XX:+G1ParallelRSetUpdatingEnabled
-XX:+G1ParallelRSetScanningEnabled
注意當(dāng)設(shè)置了-XX:+PrintGCDetails后,G1比起其它HotSpot GC要啰嗦得多,因?yàn)樗鼤?huì)打印每個(gè)GC線程的計(jì)時(shí)和其它有助于進(jìn)行故障排除的信息,如果你想使GC日志更簡(jiǎn)單,請(qǐng)使用-verbosegc參數(shù)。
Java 7 G1最新進(jìn)展
G1開(kāi)發(fā)現(xiàn)在主要集中在遺留的可靠性問(wèn)題和改善性能,同時(shí)也在逐步移除下面的限制:
◆G1不能完全支持JVM工具接口(JVM TI)或Java管理擴(kuò)展(JMX),因此關(guān)于G1的監(jiān)視和管理工具很可能不能正常工作;
◆G1不支持增量永久性代回收,如果一個(gè)應(yīng)用程序產(chǎn)生了許多類轉(zhuǎn)儲(chǔ),需要永久性代回收,這在完整GC期間是可以實(shí)現(xiàn)的;
◆從GC暫停時(shí)間來(lái)說(shuō),G1有時(shí)表現(xiàn)比CMS好有時(shí)比CMS差。
原文:Java HotSpot Garbage Collection