Epsilon GC入門:操作不要の実験的ガベージコレクター

  • link:/category/architecture/ [アーキテクチャ]

  • Java

  • JVM

1. 前書き

Java 11は、Epsilonと呼ばれるhttps://openjdk.java.net/jeps/318[No-Op Garbage Collector]を導入しました。
この短いチュートリアルでは、Epsilonがどのように機能するかを調査し、一般的なユースケースについて説明します。

2. クイックハンズオン

手を汚すことから始めましょう、そしてイプシロンGCを試してみましょう!
まず、ガベージを作成するアプリケーションが必要です。
class MemoryPolluter {

    static final int MEGABYTE_IN_BYTES = 1024 * 1024;
    static final int ITERATION_COUNT = 1024 * 10;

    static void main(String[] args) {
        System.out.println("Starting pollution");

        for (int i = 0; i < ITERATION_COUNT; i++) {
            byte[] array = new byte[MEGABYTE_IN_BYTES];
        }

        System.out.println("Terminating");
    }
}
このコードは、ループ内に1メガバイト配列を作成します。 ループを10240回繰り返すので、10ギガバイトのメモリを割り当てることになります。これは、使用可能な最大ヒープサイズよりも大きい可能性があります。
また、アプリケーションが終了するタイミングを確認するためのヘルパープリントも提供しました。
  • Epsilon GCを有効にするには、次のVM引数を渡す必要があります:*

-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC
そして、アプリケーションを実行すると、次のエラーが表示されます。
Starting pollution
Terminating due to java.lang.OutOfMemoryError: Java heap space
ただし、同じアプリケーションを標準のVMオプションで実行すると、問題なく完了します。
Starting pollution
Terminating
最初の実行が失敗したのはなぜですか? *最も基本的なガベージコレクターでさえ、先ほど示した子供の遊びを片付けることができるようです!
それでは、何が起こったのかを理解するために、Epsilon GCの背後にある概念を見てみましょう。

3. Epsilon GCの仕組み

Epsilonはノーオペレーションガベージコレクターです。
https://openjdk.java.net/jeps/318[JEP 318]は、「* [Epsilon]…メモリ割り当てを処理しますが、実際のメモリ再生メカニズムは実装していません」と説明しています。 利用可能なJavaヒープが使い果たされると、JVMはシャットダウンします。* "
したがって、これは、アプリケーションが_OutOfMemoryError._で終了した理由を説明しています。
しかし、それは疑問を提起します:ガベージコレクターが必要なのに、ガベージを収集しないのはなぜですか?
*使用可能なヒープが十分であることがわかっているため、JVMでリソースを使用してGCタスクを実行したくない場合があります。*
そのようなケースのいくつかの例(関連するJEPからも):
  • 性能試験

  • メモリープレッシャーテスト

  • VMインターフェースのテスト

  • 非常に短命の仕事

  • ラストドロップレイテンシの改善

  • ラストドロップスループットの改善

4. 結論

この短い記事では、Java 11で使用可能なノーオペレーションGCであるEpsilonについて学びました。 私たちはそれを使用することの意味について学び、それが便利かもしれないいくつかのケースをレビューしました。
いつものように、例はhttps://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-11[GitHub上]で入手できます。