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:
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
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!