您正在使用什么垃圾收集器?
我們的研究實驗室正全速前進(jìn)。 隨著最近的資金注入 ,我們只能保證我們不斷創(chuàng)新的步伐只會加快。 我們進(jìn)行的部分研究與GC優(yōu)化有關(guān)。 在處理這個有趣領(lǐng)域中的問題時,我們認(rèn)為可以分享一些有關(guān)GC算法使用的見解。
為此,我們對使用特定GC算法的頻率進(jìn)行了研究。 結(jié)果有些令人驚訝。 讓我從數(shù)據(jù)的背景開始-我們可以訪問來自84,936個會話的數(shù)據(jù),這些會話代表2670個不同環(huán)境用于研究。 13%的環(huán)境明確指定了GC算法。 其余的決定權(quán)交給了JVM。 因此,在使用顯式GC算法的11,062會話中,我們能夠區(qū)分出六種不同的GC算法:
在了解有關(guān)GC算法用法的詳細(xì)信息之前,我們應(yīng)該停一會兒并嘗試?yán)斫鉃槭裁瓷厦娴娘瀳D中缺少87%的運(yùn)行。 我們認(rèn)為,這是兩個不同根本原因的征兆
- 首先也是有充分理由的是– JVM在選擇合理的默認(rèn)值方面已經(jīng)非常出色,以至于開發(fā)人員不再需要深入研究。 如果您的應(yīng)用程序吞吐量和延遲足夠,那么,確實如此-為什么要打擾?
- 缺少GC算法的第二個可能原因表明,應(yīng)用程序性能并不是團(tuán)隊的首要任務(wù)。 正如我們?nèi)ツ甑陌咐芯克砻鞯哪菢?#xff0c;僅需調(diào)整一項配置即可顯著提高吞吐量和延遲。
因此,我們有近83,000個使用默認(rèn)GC選擇運(yùn)行的JVM。 但是默認(rèn)值是什么? 答案既簡單又復(fù)雜。 如果認(rèn)為您正在客戶端JVM上運(yùn)行,則JVM所應(yīng)用的默認(rèn)值為串行GC(-XX:+ UseSerialGC)。 在服務(wù)器級計算機(jī)上,默認(rèn)值為并行GC(-XX:+ UseParallelGC)。 可以基于以下決策表確定是在服務(wù)器還是客戶端類計算機(jī)上運(yùn)行:
| 建筑 | CPU /內(nèi)存 | 操作系統(tǒng) | 默認(rèn) |
| i586 | 任何 | 微軟視窗 | 客戶 |
| AMD64 | 任何 | 任何 | 服務(wù)器 |
| 64位SPARC | 任何 | 的Solaris | 服務(wù)器 |
| 32位SPARC | 2個以上內(nèi)核和> 2GB RAM | 的Solaris | 服務(wù)器 |
| 32位SPARC | 1核或<2GB RAM | 的Solaris | 客戶 |
| i568 | 2個以上內(nèi)核和> 2GB RAM | Linux或Solaris | 服務(wù)器 |
| i568 | 1核或<2GB RAM | Linux或Solaris | 客戶 |
但是,讓我們回到在配置中已明確指定GC算法的13%的人。 它以良好的舊串行模式開始,不足為奇的是,它的用戶群很小,因此在上圖中幾乎看不到。 實際上,只有31個環(huán)境確定這是最佳的GC算法,并且已明確指定了該算法。 考慮到當(dāng)今大多數(shù)平臺都在多核計算機(jī)上運(yùn)行,??您應(yīng)該不會感到驚訝–當(dāng)您擁有多個核時,幾乎總是建議從串行模式切換。
| GC | 計數(shù) |
| 序列號 | 31 |
| 平行 | 1,422 |
| 平行舊 | 1,193 |
| ConcMarkSweep | 6,655 |
| CMSIncrementalMode | 935 |
| G1 | 826 |
其余配置可以分為三組-并行,并發(fā)和G1。 勝利者很清楚–并發(fā)標(biāo)記和掃描算法的組合占樣本的三分之二以上。 但是,讓我們更深入地研究結(jié)果。
Parallel和ParallelOld模式大致在同一鄰域中,具有1,422和1,193個樣本。 不足為奇–如果您確定并行模式適合您的年輕一代,那么與老一代相同的算法通常也表現(xiàn)良好。 并行模式中另一個有趣的方面是–從上面可以看出,并行模式是大多數(shù)常見平臺上的默認(rèn)模式,因此缺少明確的規(guī)范并不意味著它不比其他模式流行。
對于CMS,我們的期望有所不同。 即–與具有6556種配置的傳統(tǒng)CMS相比,增量模式僅在935次打開。 提醒您-在并發(fā)階段,垃圾收集器線程正在使用一個或多個處理器。 增量模式用于通過定期停止并發(fā)階段以使處理器退還給應(yīng)用程序來減少長時間的并發(fā)階段的影響。 這樣可以縮短暫停時間,尤其是在處理器數(shù)量少的機(jī)器上。 目前尚不清楚環(huán)境是否全部具有海量核心,還是負(fù)責(zé)配置的人員只是不知道增量模式的好處。
但是我們最大的驚喜與G1的采用率有關(guān)。 G1作為垃圾收集算法正在運(yùn)行826個環(huán)境。 根據(jù)我們的經(jīng)驗,無論您是追求吞吐量還是等待時間,G1的性能往往都比CMS差。 也許我們可以使用的測試用例的選擇不多,但是目前我們認(rèn)為G1需要更多的時間來實際兌現(xiàn)其承諾。 因此,如果您是快樂的G1用戶,也許您可??以與我們分享您的經(jīng)驗?
翻譯自: https://www.javacodegeeks.com/2013/11/what-garbage-collector-are-you-using.html
總結(jié)
以上是生活随笔為你收集整理的您正在使用什么垃圾收集器?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java VM –提防YoungGen空
- 下一篇: 战略模式并不意味着春天!