Lima bentuk mekanisme pengumpulan sampah JVM: tafsiran dan perbandingan terperinci apabila program sedang berjalan. Artikel ini akan menerangkan secara terperinci lima bentuk mekanisme kutipan sampah JVM dan membandingkan kebaikan dan keburukan di antara mereka. Pada masa yang sama, kami juga akan menyediakan contoh kod khusus untuk membantu pembaca memahami dengan lebih baik mekanisme pengumpulan sampah ini.
1. Pengenalan
JVM ialah singkatan Java Virtual Machine, iaitu persekitaran berjalan untuk program Java. Dalam program Java, apabila objek dicipta dalam ingatan, mekanisme yang sepadan diperlukan untuk menuntut semula ruang memori yang didudukinya. Ini adalah tugas kutipan sampah. 2. Algoritma Mark-Sweep (Mark-Sweep)Algoritma mark-sweep ialah salah satu algoritma kutipan sampah yang paling awal dan paling asas. Prinsipnya mudah: pertama, bermula dari nod akar, semua objek yang boleh dicapai ditandakan kemudian, objek yang tidak bertanda akan dikosongkan.
Kod contoh:
public class MarkSweep { private boolean marked; public void setMarked(boolean marked) { this.marked = marked; } public boolean isMarked() { return marked; } } public class GC { public static void main(String[] args) { MarkSweep object1 = new MarkSweep(); MarkSweep object2 = new MarkSweep(); object1.setMarked(true); System.gc(); // 垃圾回收 if (object1.isMarked()) { System.out.println("object1 is reachable"); } else { System.out.println("object1 is garbage"); } if (object2.isMarked()) { System.out.println("object2 is reachable"); } else { System.out.println("object2 is garbage"); } } }
Algoritma penyalinan menggunakan strategi berbeza untuk menyelesaikan masalah kutipan sampah. Ia membahagikan memori yang ada kepada dua blok dan hanya menggunakan satu blok pada satu masa. Apabila sekeping memori digunakan, salin objek yang masih hidup ke sekeping memori yang lain, dan kemudian kosongkan semua objek dalam memori semasa.
public class Copying { private boolean marked; public void setMarked(boolean marked) { this.marked = marked; } public boolean isMarked() { return marked; } } public class GC { public static void main(String[] args) { Copying object1 = new Copying(); Copying object2 = new Copying(); object1.setMarked(true); System.gc(); // 垃圾回收 if (object1.isMarked()) { System.out.println("object1 is reachable"); } else { System.out.println("object1 is garbage"); } if (object2.isMarked()) { System.out.println("object2 is reachable"); } else { System.out.println("object2 is garbage"); } } }
Algoritma pemampatan tanda ialah algoritma pengumpulan sampah yang menggabungkan algoritma sapuan tanda dan algoritma salin. Mula-mula ia menandakan objek hidup, kemudian mengalihkannya ke satu hujung, dan kemudian mengosongkan objek lain.
public class MarkCompact { private boolean marked; public void setMarked(boolean marked) { this.marked = marked; } public boolean isMarked() { return marked; } } public class GC { public static void main(String[] args) { MarkCompact object1 = new MarkCompact(); MarkCompact object2 = new MarkCompact(); object1.setMarked(true); System.gc(); // 垃圾回收 if (object1.isMarked()) { System.out.println("object1 is reachable"); } else { System.out.println("object1 is garbage"); } if (object2.isMarked()) { System.out.println("object2 is reachable"); } else { System.out.println("object2 is garbage"); } } }
Algoritma kitar semula generasi menggunakan strategi yang lebih disasarkan untuk membahagikan memori kepada generasi yang berbeza (Generasi) mengikut kitaran hayat objek. Biasanya, objek yang baru dicipta diperuntukkan kepada generasi baharu, dan objek yang bertahan berbilang GC dipindahkan ke generasi lama.
public class Generational { private boolean marked; public void setMarked(boolean marked) { this.marked = marked; } public boolean isMarked() { return marked; } } public class GC { public static void main(String[] args) { Generational object1 = new Generational(); Generational object2 = new Generational(); object1.setMarked(true); System.gc(); // 垃圾回收 if (object1.isMarked()) { System.out.println("object1 is reachable"); } else { System.out.println("object1 is garbage"); } if (object2.isMarked()) { System.out.println("object2 is reachable"); } else { System.out.println("object2 is garbage"); } } }
Atas ialah kandungan terperinci Lima bentuk mekanisme kutipan sampah JVM: tafsiran dan perbandingan terperinci. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!