Rumah  >  Artikel  >  Java  >  Lima bentuk mekanisme kutipan sampah JVM: tafsiran dan perbandingan terperinci

Lima bentuk mekanisme kutipan sampah JVM: tafsiran dan perbandingan terperinci

王林
王林asal
2024-02-23 09:00:05922semak imbas

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.

Lima bentuk mekanisme kutipan sampah JVM: tafsiran dan perbandingan terperinci1. 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");
        }
    }
}

3. Algoritma penyalinan (Menyalin)

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.

Kod sampel:

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");
        }
    }
}

4. Algoritma Mark-Compact (Mark-Compact)

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.

Kod sampel:

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");
        }
    }
}

5. Algoritma kitar semula generasi (Generasional)

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.

Kod sampel:

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");
        }
    }
}

6. Penilaian dan perbandingan


Algoritma tanda jelas adalah yang paling asas, tetapi ia kurang cekap dan akan menghasilkan pemecahan memori.

Algoritma salin adalah mudah dan cekap, tetapi ia hanya boleh menggunakan separuh daripada ruang memori.

Algoritma pemampatan tanda menggabungkan kelebihan dua algoritma pertama, tetapi memerlukan objek bergerak dan kurang cekap sedikit.
  1. Algoritma kitar semula generasi melaksanakan kitar semula generasi mengikut kitaran hayat objek, yang boleh mencapai kitar semula yang lebih disasarkan, tetapi ia akan meningkatkan kerumitan sistem.
  2. Algoritma kutipan sampah yang berbeza sesuai untuk senario aplikasi yang berbeza, dan adalah sangat penting untuk memilih algoritma yang sesuai.
  3. Kesimpulan:
  4. Lima bentuk mekanisme kutipan sampah JVM, masing-masing mempunyai kelebihan dan kekurangan tersendiri. Memilih algoritma kitar semula yang sesuai memerlukan pertukaran berdasarkan senario dan keperluan aplikasi tertentu. Artikel ini memberikan penjelasan terperinci dan contoh kod, dengan harapan dapat membantu pembaca memahami dan menggunakan mekanisme kutipan sampah ini dengan lebih baik.

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!

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