Java 8まで、デフォルトのガベージコレクターとしてParallel GCを見てきましたが、Java(Java 9)の最近のリリースが登場しましたG1 GCをデフォルトのガベージコレクタとして使用します。
JavaがG1GCに移行したのはなぜですか?パフォーマンスの向上はありますか?
から JEP 248 (JEP-JDK拡張提案)
概要
G1を32ビットおよび64ビットサーバー構成のデフォルトのガベージコレクターにします。
動機
一般に、GCの一時停止時間を制限することは、スループットを最大化することよりも重要です。 G1などの一時停止の少ないコレクターに切り替えると、現在デフォルトであるParallel GCなどのスループット指向のコレクターよりも、ほとんどのユーザーにとって全体的なエクスペリエンスが向上するはずです。
JDK 8とそのアップデートリリースではG1に多くのパフォーマンスの改善が加えられ、JDK 9ではさらに改善が計画されています。JDK8u40での同時クラスアンロード(JEP 156)の導入により、G1はフル機能のガベージコレクタになりました。デフォルト。
要約すると、これは彼らが長い間取り組んできたものであり、Java 9の場合、彼らは最終的にデフォルトの準備ができていると判断しました。
Oleg による答えは、 g1gc (有用なタグ情報)の導入の背後にある動機を正確に述べています。
なぜJavaはG1GCに移行しましたか?パフォーマンスは向上していますか?
Java-9 で導入された最近の変更から学んだいくつかの重要な改善点をリストアップすると、次のようになります。
フルGCの回避は、Java 8までデフォルトGCとして使用される並列GCと比較した場合の主要な改善点の1つです。
G1の目標は、ヒープサイズやライブデータの量を制限することなく、一時停止時間を最小限に抑えることです。これは、GC作業の大部分を同時に実行し、部分的な圧縮も実行することによって実現されます。完全なGC(つまり、ストップザワールドGC)を回避することは、G1の主な利点の1つです。
この時期のG1の主な機能改善の1つは、同時クラスアンロードの導入でした。以前は、G1は、完全なGCを除いて、すべてのクラスをライブとして扱いました。これは主に 永久世代の削除を伴いました。
消費アプリケーションの観点からのもう1つの機能は、G1 GCに自動で継続的な文字列重複排除を実装して、メモリの浪費を回避し、メモリフットプリントを削減することでした。この変更は、String
クラスの内部表現がUTF-16
char配列からbyte
配列に変更され、さらに として提案されたエンコーディングフラグフィールドが追加されました。 コンパクトな文字列。
とはいえ、G1のリソース使用量はParallel GCとは異なり、リソース使用量のオーバーヘッドを最小限に抑える必要がある場合は、G1以外のコレクターを使用する必要があると述べています。この変更により、代替コレクターを明示的に指定する必要があります。