Seri GC

Pengumpulan sampah meningkatkan efisiensi memori di Java dengan menghapus objek yang tidak direferensikan dari heap dan memberi ruang untuk objek yang baru dibuat.

Mesin virtual Java memiliki delapan jenis pengumpul sampah. Mari kita pertimbangkan masing-masing secara mendetail.

Serial GC adalah implementasi GC yang paling sederhana. Ini ditujukan untuk aplikasi kecil yang berjalan di lingkungan single-threaded. Semua acara pengumpulan sampah dijalankan secara berurutan di utas yang sama. Pemadatan dilakukan setelah setiap pengumpulan sampah.

Seri GC

Menjalankan kolektor menghasilkan acara "stop dunia", di mana seluruh aplikasi ditangguhkan. Karena seluruh aplikasi dibekukan selama pengumpulan sampah, Anda tidak boleh menggunakan ini dalam kehidupan nyata jika Anda ingin menunda serendah mungkin.

Argumen JVM untuk menggunakan pengumpul sampah serial adalah -XX:+UseSerialGC .

GC paralel

Pengumpul sampah paralel dirancang untuk aplikasi dengan kumpulan data sedang hingga besar yang berjalan pada perangkat keras multithreaded atau multiprosesor. Ini adalah implementasi GC default dan juga dikenal sebagai pengumpul throughput.

Beberapa utas ditujukan untuk pengumpulan sampah kecil di generasi muda. Satu-satunya utas sibuk dengan pengumpulan sampah utama di generasi yang lebih tua.

GC paralel

Menjalankan GC paralel juga menyebabkan dunia "berhenti" dan aplikasi hang. Perilaku ini lebih sesuai untuk lingkungan multi-utas di mana banyak tugas harus diselesaikan dan jeda panjang dapat diterima, seperti saat menjalankan tugas batch.

Argumen JVM untuk menggunakan pengumpul sampah paralel adalah -XX:+UseParallelGC .

CMSGC

Juga dikenal oleh kami sebagai pemetik paralel istirahat rendah .

Di sini, untuk pengumpulan sampah kecil, beberapa utas terlibat, ini terjadi melalui algoritme yang sama seperti pada kolektor paralel. Pengumpulan sampah utama adalah multi-utas, seperti GC paralel lama, tetapi CMS berjalan bersamaan dengan proses aplikasi untuk meminimalkan peristiwa "stop dunia".

CMSGC

Karena itu, pengumpul CMS mengkonsumsi lebih banyak CPU daripada pengumpul lainnya. Jika Anda memiliki kemampuan untuk mengalokasikan lebih banyak CPU untuk meningkatkan kinerja, CMS lebih disukai daripada kolektor paralel sederhana. CMS GC tidak kompak.

Argumen JVM untuk menggunakan pengumpul sampah mark-sweep paralel adalah -XX:+UseConcMarkSweepGC .

G1 (Sampah dulu) GC

G1GC disusun sebagai pengganti CMS dan dikembangkan untuk aplikasi multi-utas yang dicirikan oleh ukuran heap yang besar (lebih dari 4 GB). Ini paralel dan kompetitif seperti CMS, tetapi di balik tudungnya cara kerjanya sangat berbeda dari pengumpul sampah lama.

Meskipun G1 juga beroperasi berdasarkan generasi, G1 tidak memiliki ruang terpisah untuk generasi muda dan tua. Sebaliknya, setiap generasi adalah sekumpulan wilayah, yang memungkinkan fleksibilitas dalam mengubah ukuran generasi muda.

G1 membagi heap menjadi sekumpulan wilayah berukuran sama (bergantung pada ukuran heap) dan memindainya menjadi beberapa utas. Area selama pelaksanaan program dapat berulang kali menjadi tua dan muda.

Setelah fase markup selesai, G1 mengetahui area mana yang paling banyak mengandung sampah. Jika pengguna tertarik untuk meminimalkan jeda, G1 hanya dapat memilih beberapa area. Jika waktu jeda tidak penting bagi pengguna, atau jika batas waktu jeda disetel ke tinggi, G1 akan menjangkau lebih banyak area.

Karena G1 GC mengidentifikasi wilayah dengan sampah terbanyak dan melakukan pengumpulan sampah di wilayah tersebut terlebih dahulu, ini disebut "Garbage First".

Selain area Eden, Survivors dan Old Memory, ada dua tipe lainnya di G1GC.

  • Humongous (Besar) - untuk objek berukuran besar (lebih dari 50% dari ukuran tumpukan).
  • Tersedia - Ruang yang tidak terpakai atau tidak terisi.

Argumen JVM untuk menggunakan pengumpul sampah G1 adalah -XX:+UseG1GC .

Shenandoah (Shandara)

Shenandoah adalah GC baru yang dirilis sebagai bagian dari JDK 12. Keunggulan utama Shenandoah dibandingkan G1 adalah sebagian besar siklus pengumpulan sampah dilakukan bersamaan dengan utas aplikasi. G1 hanya dapat mengevakuasi area tumpukan saat aplikasi ditangguhkan, sementara Shenandoah memindahkan objek bersamaan dengan aplikasi.

Shenandoah dapat memadatkan benda hidup, membersihkan sampah, dan membebaskan RAM segera setelah memori kosong ditemukan. Karena semua ini terjadi pada saat yang sama, tanpa menangguhkan aplikasi, Shenandoah lebih intensif menggunakan CPU.

Argumen JVM untuk pengumpul sampah Shenandoah: -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC .

ZGC

ZGC adalah GC lain yang dirilis sebagai bagian dari JDK 11 dan ditingkatkan di JDK 12.

Ini ditujukan untuk aplikasi yang membutuhkan kecepatan dan latensi rendah (jeda kurang dari 10 ms) dan/atau menggunakan tumpukan yang sangat besar (beberapa terabyte).

Tujuan utama ZGC adalah latensi rendah, skalabilitas, dan kemudahan penggunaan. Untuk melakukan ini, memungkinkan aplikasi Java untuk terus berjalan meskipun operasi pengumpulan sampah sedang berlangsung. Secara default, ZGC melepaskan memori yang tidak terpakai dan mengembalikannya ke sistem operasi.

Dengan demikian, ZGC membawa peningkatan yang signifikan dibandingkan GC tradisional lainnya dengan memberikan waktu mati yang sangat rendah (biasanya dalam 2 md).

Tujuan utama ZGC 

Argumen JVM untuk menggunakan pengumpul sampah ZGC adalah -XX:+UnlockExperimentalVMOptions -XX:+UseZGC .