Java 8 最快的垃圾蒐集器是什麼?
OpenJDK 8 有多種 GC(Garbage Collector)演算法,如 Parallel GC、CMS 和 G1。哪一個才是最快的呢?如果在 Java 9 中將 Java 8 預設的 GC 從 Parallel GC 改為 G1 (目前只是建議)將會怎麼樣呢?讓我們對此進行基準測試。
基準測試方法
執行相同的程式碼六次,每次使用不同的VM引數(-XX:+UseSerialGC, -XX:+UseParallelGC, -XX:+UseConcMarkSweepGC, -XX:ParallelCMSThreads=2, -XX:ParallelCMSThreads=4, -XX:+UseG1GC)。
每次執行大概花費55分鐘。
其它VM引數:-Xmx2048M -server
OpenJDK版本:1.8.0_51(當前最新的版本)
軟體:Linux version 4.0.4-301.fc22.x86_64
硬體:Intel? Core? i7-4790 CPU @ 3.60GHz
每次執行13個?OptaPlanner?規劃問題方案。每次執行時間為5分鐘。前30秒用於JVM預熱,不計算在內。
解決規劃問題不涉及 IO (除了啟動時需要幾毫秒來載入輸入資訊)。單個 CPU 使用完全飽和。通常會建立許多存活時間很短的物件,GC 之後就會回收這些物件。
衡量標準可以是計算每毫秒的得分,越高越好。計算一個擬議規劃解決方案是一個不可小覷的問題:涉及到大量的計算,包括每個實體與其他所有實體的衝突檢測。
為了能在本地重複執行這些基準測試,可以從原始碼進行構建,然後執行主類 GeneralOptaPlannerBenchmarkApp。
基準測試結果
執行結果
為了方便檢視,我已經對每種 GC 與 Java 8 預設 GC(Parallel GC)進行了比較。
結果非常清楚:預設(Parallel GC)是最快的。
原始基準測試資料
相對基準測試資料
Java 9 預設應該為 G1 嗎?
有一種提議是在 OpenJDK9 的伺服器端使用 G1 作為預設 GC。我第一反應就是拒絕該提議:
G1 的平均值要慢17.60%
G1 在每個資料集用例下都比較慢。
在最大資料集(Machine Reassignment B10)下,表現比其它資料集都要差,G1 慢了34.07%。
如果在開發機和伺服器之間採用不同的預設 GC,則開發者基準測試的可信度就會下降。
另一方面,存在幾個需要注意的細節:
G1 關注是 GC 暫停的問題,而不是吞吐量。對於這些用例(計算量比較大),GC 暫停時長基本沒影響。
這是一個(基本是)單執行緒的基準測試。並行解決多個問題或採用多執行緒解決的基準測試,結果可能不同。
G1 推薦的堆記憶體至少是 6GB。而這次基準測試的堆記憶體是 2GB,即使在最大資料集(Machine Reassignment B10)也只需要這麼多記憶體。
海量計算只是 OpenJDK 的諸多功能中的一個:這是在社群廣泛爭論的一個問題。如果有其他方面(如網站服務)的證明,可能值得改變預設GC。但是,請首先向我展示你實際專案的基準測試。
結論
在 Java 8 中,對 OptaPlanner 用例來說,預設 GC(Parallel GC)通常情況是最好的選擇。
相關文章
- 什麼是垃圾蒐集(GC)?為什麼要有GC呢?GC
- Java是什麼_Java是做什麼的?Java
- 什麼是 Java 構造器?Java
- Java虛擬機器是什麼?Java虛擬機
- java8預設使用的垃圾收集器Java
- Java虛擬機器1:什麼是JavaJava虛擬機
- 什麼是Unicode,什麼是UTF-8Unicode
- 併發的核心:CAS 是什麼?Java8是如何優化 CAS 的?Java優化
- PHP中什麼是垃圾回收?對效能有什麼影響PHP
- Java是什麼?主要是幹什麼的?Java
- Java是什麼? Java適用於什麼工作?Java
- 什麼是java常量?Java
- 什麼是java常量Java
- java 中/**是什麼Java
- 什麼是JAVA ? (轉)Java
- Java是什麼 (轉)Java
- Java垃圾回收是如何工作的?Java
- 即便C++現在是增長最快的語言,為什麼它不及Java、Python流行?C++JavaPython
- 什麼是海外伺服器?它的優點是什麼?伺服器
- Java JVM:垃圾回收(GC 在什麼時候,對什麼東西,做了什麼事情)JavaJVMGC
- 清理c盤垃圾的cmd命令是什麼 win10清理c盤垃圾的cmd命令Win10
- 什麼是WEB伺服器,什麼是應用伺服器Web伺服器
- DHCP是什麼?DHCP伺服器是什麼意思?伺服器
- TEKLA C# 選擇模型中所有焊縫的最快方法是什麼C#模型
- Java是用來幹什麼的?Java
- Java swing是什麼?有什麼作用?Java
- java中RMI是什麼Java
- java中@Inherited是什麼?Java
- java中@Retention是什麼?Java
- Java 繼承是什麼?Java繼承
- Java專案是什麼?Java
- 抽象類和介面到底是什麼垃圾——秒懂抽象
- 超硬核的Java工程師分享,什麼是Java?為什麼我要做Java,我是如何學習Java的?Java工程師
- 什麼是伺服器?伺服器
- 伺服器是什麼伺服器
- 號稱能將STW幹掉1ms以內的Java垃圾收集器ZGC到底是個什麼東西?JavaGC
- 什麼是域名伺服器?域名伺服器的作用是什麼?伺服器
- 8年Java面試官:月薪8000和30000的差距是什麼?Java面試