Rumah  >  Artikel  >  Java  >  Menggunakan Java EpsilonGC untuk melihat peruntukan memori.

Menggunakan Java EpsilonGC untuk melihat peruntukan memori.

WBOY
WBOYasal
2024-09-08 16:31:33813semak imbas

Using Java EpsilonGC to look at memory allocation.

Kod yang dirujuk dalam artikel ini diperoleh daripada kod sampel yang tersedia di blog Oracle berkenaan Epsilon GC.

Dalam artikel ini, kami meneroka pilihan yang sangat menarik dalam Java Garbage Collection (GC) yang dikenali sebagai Epsilon GC. Algoritma kutipan sampah ini terkenal dengan ciri tersendiri: ia tidak melakukan pengumpulan sampah. Pengumpul sampah Epsilon (GC) telah disertakan dalam JDK 11.

Tetapi apa guna pemungut sampah jika tidak mengutip? (pemuat percuma huh!!)

Tidak, ia sebenarnya agak berguna, satu kes penggunaan seperti yang disediakan oleh blog Oracle, yang saya telah pertingkatkan sedikit supaya lebih membantu.

Untuk butiran lanjut, sila rujuk catatan blog asal:
https://blogs.oracle.com/javamagazine/post/epsilon-the-jdks-do-nothing-garbage-collector

Kes penggunaan: Epsilon GC bermanfaat untuk pembangun yang perlu menilai peruntukan memori untuk segmen kod tertentu tanpa bantuan alat pemprofilan.

Cabaran Utama Pengumpul sampah tradisional boleh mengaburkan metrik penggunaan memori yang tepat dengan mengosongkan objek secara berterusan. Gangguan ini menyukarkan untuk memastikan penggunaan memori sebenar kod anda.

Epsilon GC menangani isu ini dengan bertindak sebagai bukan pengumpul. Walaupun bukan algoritma kutipan sampah semata-mata, ia berfungsi sebagai alat untuk memahami peruntukan memori dengan mengelak daripada melakukan sebarang kutipan sampah, dengan itu memberikan gambaran yang jelas tentang penggunaan memori.

Nota: Adalah penting untuk mengetahui bahawa memandangkan Epsilon GC tidak menuntut semula ingatan, peruntukan yang berlebihan boleh membawa kepada OutOfMemoryError (OOM) dalam JVM.

Di bawah ialah kod sampel yang akan digunakan untuk menunjukkan keberkesanan 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();
    }
}

Jangkaan:
Kod ini memperuntukkan 80MB objek jenis bait. Kita sepatutnya dapat melihat perkara yang sama dengan kenyataan cetakan apabila kita melaksanakan kod.

Sekarang untuk menjalankan versi yang disusun dengan/tanpa EpsilonGC:

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

Jadi dengan G1GC kita melihat gambar peruntukan yang salah untuk penggunaan 28 MB

  1. Berjalan dengan 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 

Di sini anda boleh melihat penggunaan 80.7 MB dengan jelas

Saya harap ini membantu anda melihat cara EpsilonGC boleh menjadi sangat berguna untuk mengesan corak penggunaan memori dalam kod anda. Cheers! ?

Atas ialah kandungan terperinci Menggunakan Java EpsilonGC untuk melihat peruntukan memori.. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn