GC bersiri

Pengumpulan sampah meningkatkan kecekapan ingatan di Jawa dengan mengalih keluar objek yang tidak dirujuk daripada timbunan dan memberi ruang untuk objek yang baru dicipta.

Mesin maya Java mempunyai lapan jenis pengumpul sampah. Mari kita pertimbangkan setiap daripada mereka secara terperinci.

GC bersiri ialah pelaksanaan GC yang paling mudah. Ia bertujuan untuk aplikasi kecil yang berjalan dalam persekitaran berbenang tunggal. Semua acara pengumpulan sampah dilaksanakan secara berurutan pada urutan yang sama. Pemadatan dilakukan selepas setiap kutipan sampah.

GC bersiri

Menjalankan pengumpul menghasilkan acara "perhentian dunia", di mana keseluruhan aplikasi digantung. Memandangkan keseluruhan aplikasi dibekukan semasa pengumpulan sampah, anda tidak seharusnya menggunakan ini dalam kehidupan sebenar jika anda ingin mengekalkan kelewatan serendah mungkin.

Argumen JVM untuk menggunakan pengumpul sampah bersiri ialah -XX:+UseSerialGC .

GC selari

Pengumpul sampah selari direka untuk aplikasi dengan set data sederhana hingga besar yang dijalankan pada perkakasan berbilang benang atau berbilang pemproses. Ini ialah pelaksanaan GC lalai dan juga dikenali sebagai pengumpul hasil.

Beberapa benang ditakdirkan untuk pengumpulan sampah kecil dalam generasi muda. Satu-satunya benang sibuk dengan kutipan sampah utama pada generasi tua.

GC selari

Menjalankan GC selari juga menyebabkan dunia "berhenti" dan aplikasi digantung. Tingkah laku ini lebih sesuai untuk persekitaran berbilang benang di mana banyak tugasan perlu diselesaikan dan jeda yang lama boleh diterima, seperti semasa menjalankan kerja kelompok.

Argumen JVM untuk menggunakan pengumpul sampah selari ialah -XX:+UseParallelGC .

CMS GC

Juga dikenali kepada kami sebagai pemetik selari rehat rendah .

Di sini, untuk pengumpulan sampah kecil, beberapa benang terlibat, ini berlaku melalui algoritma yang sama seperti dalam pengumpul selari. Pengumpulan sampah utama adalah berbilang benang, sama seperti GC selari lama, tetapi CMS berjalan serentak dengan proses aplikasi untuk meminimumkan peristiwa "perhentian dunia".

CMS GC

Oleh sebab itu, pengumpul CMS menggunakan lebih banyak CPU daripada pengumpul lain. Jika anda mempunyai keupayaan untuk memperuntukkan lebih banyak CPU untuk meningkatkan prestasi, maka CMS adalah lebih baik daripada pengumpul selari yang ringkas. CMS GC tidak padat.

Argumen JVM untuk menggunakan pengumpul sampah sapu tanda selari ialah -XX:+UseConcMarkSweepGC .

G1 (Sampah dahulu) GC

G1GC diilhamkan sebagai pengganti CMS dan dibangunkan untuk aplikasi berbilang benang yang dicirikan oleh saiz timbunan besar (lebih daripada 4 GB). Ia selari dan berdaya saing seperti CMS, tetapi di bawah hud ia berfungsi dengan sangat berbeza daripada pengumpul sampah lama.

Walaupun G1 juga beroperasi secara generasi, ia tidak mempunyai ruang yang berasingan untuk generasi muda dan lebih tua. Sebaliknya, setiap generasi adalah satu set wilayah, membolehkan fleksibiliti dalam mengubah saiz generasi muda.

G1 membahagikan timbunan kepada satu set kawasan yang sama saiz (bergantung pada saiz timbunan) dan mengimbasnya kepada berbilang benang. Kawasan semasa pelaksanaan program boleh berulang kali menjadi tua dan muda.

Selepas fasa penandaan selesai, G1 mengetahui kawasan mana yang mengandungi paling banyak sampah. Jika pengguna berminat untuk meminimumkan jeda, G1 hanya boleh memilih beberapa kawasan. Jika masa jeda tidak penting kepada pengguna, atau jika had masa jeda ditetapkan kepada tinggi, G1 akan melalui lebih banyak kawasan.

Memandangkan G1 GC mengenal pasti kawasan yang mempunyai paling banyak sampah dan melakukan kutipan sampah di kawasan tersebut terlebih dahulu, ia dipanggil "Sampah Didahulukan".

Selain kawasan Eden, Survivors dan Old Memory, terdapat dua jenis lain dalam G1GC.

  • Humongous (Besar) - untuk objek bersaiz besar (lebih daripada 50% saiz timbunan).
  • Tersedia - Ruang yang tidak digunakan atau tidak diperuntukkan.

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

Shenandoah (Shandara)

Shenandoah ialah GC baharu yang dikeluarkan sebagai sebahagian daripada JDK 12. Kelebihan utama Shenandoah berbanding G1 ialah kebanyakan kitaran pengumpulan sampah dilakukan serentak dengan urutan aplikasi. G1 hanya boleh mengosongkan kawasan timbunan apabila aplikasi digantung, manakala Shenandoah mengalihkan objek pada masa yang sama dengan aplikasi.

Shenandoah boleh memampatkan objek hidup, membersihkan sampah dan mengosongkan RAM hampir sebaik sahaja memori bebas ditemui. Memandangkan semua ini berlaku pada masa yang sama, tanpa menggantung aplikasi, Shenandoah lebih intensif CPU.

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

ZGC

ZGC ialah satu lagi GC yang dikeluarkan sebagai sebahagian daripada JDK 11 dan dipertingkatkan dalam JDK 12.

Ia bertujuan untuk aplikasi yang memerlukan kelajuan dan kependaman rendah (jeda kurang daripada 10 ms) dan/atau menggunakan timbunan yang sangat besar (beberapa terabait).

Matlamat utama ZGC ialah kependaman rendah, kebolehskalaan dan kemudahan penggunaan. Untuk melakukan ini, ia membenarkan aplikasi Java untuk terus berjalan walaupun pada hakikatnya operasi pengumpulan sampah sedang dijalankan. Secara lalai, ZGC mengeluarkan memori yang tidak digunakan dan mengembalikannya kepada sistem pengendalian.

Oleh itu, ZGC membawa peningkatan yang ketara berbanding GC tradisional lain dengan menyediakan masa mati yang sangat rendah (biasanya dalam 2ms).

Objektif utama ZGC 

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