ホームページ  >  記事  >  Java  >  Java EpsilonGC を使用してメモリ割り当てを確認します。

Java EpsilonGC を使用してメモリ割り当てを確認します。

WBOY
WBOYオリジナル
2024-09-08 16:31:33813ブラウズ

Using Java EpsilonGC to look at memory allocation.

この記事で参照されているコードは、Epsilon GC に関する Oracle ブログで入手可能なサンプル コードから引用されています。

この記事では、Epsilon GC として知られる Java ガベージ コレクション (GC) の特に興味深いオプションについて説明します。このガベージ コレクション アルゴリズムは、ガベージ コレクションを実行しないという独特の機能で注目に値します。 Epsilon ガベージ コレクター (GC) は JDK 11 に含まれていました。

しかし、ガベージ コレクターが収集しなければ、何の役に立つのでしょうか? (居候か!!)

いいえ、これは実際には非常に便利です。Oracle ブログで提供されているユースケースの 1 つで、より役立つように私が少し拡張しました。

詳細については、元のブログ投稿を参照してください:
https://blogs.oracle.com/javamagazine/post/epsilon-the-jdks-do-nothing-garbage-collector

使用例: Epsilon GC は、プロファイリング ツールを使用せずにコードの特定セグメントのメモリ割り当てを評価する必要がある開発者にとって有益です。

主な課題 従来のガベージ コレクターは、オブジェクトを継続的にクリアすることにより、正確なメモリ使用量のメトリクスを不明瞭にする可能性があります。この干渉により、コードの実際のメモリ消費量を確認することが困難になります。

Epsilon GC は、非コレクターとして機能することでこの問題に対処します。それ自体はガベージ コレクション アルゴリズムではありませんが、ガベージ コレクションの実行を控えることでメモリ割り当てを理解するためのツールとして機能し、メモリ使用量を明確に把握できます。

: Epsilon GC はメモリを再利用しないため、過剰な割り当てにより JVM で OutOfMemoryError (OOM) が発生する可能性があることに注意することが重要です。

以下は、Epsilon GC の有効性を実証するために利用されるサンプル コードです。

public class EpsilonDemo {

    public static String formatSize(long v) {
        if (v < 1024) return v + " B";
        int z = (63 - Long.numberOfLeadingZeros(v)) / 10;
        return String.format("%.1f %sB", (double)v / (1L << (z*10)), " KMGTPE".charAt(z));
    }
    public static void printmem(){
        System.out.println("*** Free MEM = "+formatSize(Runtime.getRuntime().freeMemory()));
    }

    public static void main(String[] args) {

        final int MEGAABYTE = 1024 * 1024;
        final int ITERATIONS = 80;

        System.out.println("Starting allocations...");
        printmem();

        // allocate memory 1MB at a time
        for (int i = 0; i < ITERATIONS; i++) {
            var array = new byte[MEGAABYTE];
        }

        System.out.println("Completed successfully");
        printmem();
    }
}

期待:
このコードは、80MB のバイト型オブジェクトを割り当てます。コードを実行すると、print ステートメントでも同じことが観察できるはずです。

ここで、EpsilonGC の有無にかかわらず、コンパイルされたバージョンを実行します。

  1. G1GC で実行:
java -Xms100m -Xmx100m -XX:+UseG1GC  EpsilonDemo
Starting allocations...
*** Free MEM = 102.2 MB
Completed successfully
*** Free MEM = 74.2 MB

G1GC では、28 MB 使用率という誤った割り当ての図が表示されます

  1. EpsilonGC で実行:
java -Xms100m -Xmx100m -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC EpsilonDemo
[0.004s][warning][gc,init] Consider enabling -XX:+AlwaysPreTouch to avoid memory commit hiccups
Starting allocations...
*** Free MEM = 99.4 MB
Completed successfully
*** Free MEM = 18.7 MB 

ここでは 80.7 MB の使用率がはっきりとわかります

これが、コード内のメモリ使用パターンを特定するのに EpsilonGC がいかに便利であるかを理解するのに役立つことを願っています。乾杯! ?

以上がJava EpsilonGC を使用してメモリ割り当てを確認します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。