1. Gambaran keseluruhan
Dalam tutorial ringkas ini, kami akan menunjukkan asas pelaksanaan JVM Garbage Collection (GC) yang berbeza . Selain itu, kami akan mengetahui cara mengaktifkan jenis Pengumpulan Sampah tertentu dalam aplikasi kami.
2. Pengenalan Ringkas Mengutip Sampah
Dari namanya, kelihatan seperti Koleksi Sampah berkaitan dengan mencari dan menghapus sampah dari ingatan. Namun, pada hakikatnya, Pengumpulan Sampah mengesan setiap objek yang terdapat di ruang timbunan JVM dan membuang objek yang tidak digunakan.
Dengan kata mudah, GC berfungsi dalam dua langkah mudah yang dikenali sebagai Mark and Sweep:
- Tandakan - di sinilah pengumpul sampah mengenal pasti kepingan memori yang digunakan dan yang tidak
- Sapu - langkah ini membuang objek yang dikenal pasti semasa fasa “mark”
Kelebihan:
- Tidak ada pengendalian peruntukan memori / penyahpindahan memori kerana ruang memori yang tidak digunakan dikendalikan secara automatik oleh GC
- Tidak ada overhead menangani Dangling Pointer
- Pengurusan Kebocoran Memori Automatik ( GC dengan sendirinya tidak dapat menjamin penyelesaian bukti penuh untuk kebocoran memori, namun, ia menguruskan sebahagian yang baik)
Kekurangan:
- Oleh kerana JVM harus mengawasi pembuatan / penghapusan rujukan objek, aktiviti ini memerlukan lebih banyak daya CPU selain aplikasi yang asli. Ini boleh mempengaruhi prestasi permintaan yang memerlukan memori yang besar
- Pengaturcara tidak mempunyai kendali atas penjadualan waktu CPU yang didedikasikan untuk membebaskan objek yang tidak lagi diperlukan
- Menggunakan beberapa implementasi GC mungkin mengakibatkan aplikasi berhenti di luar jangkaan
- Pengurusan memori automatik tidak akan seefisien dengan peruntukan / pembuangan memori manual yang betul
3. Pelaksanaan GC
JVM mempunyai empat jenis pelaksanaan GC :
- Pemungut Siri Bersiri
- Pemungut Sampah Selari
- Pemungut Sampah CMS
- Pemungut Sampah G1
3.1. Pemungut Siri Bersiri
Ini adalah pelaksanaan GC termudah, kerana pada dasarnya berfungsi dengan satu utas. Hasilnya, pelaksanaan GC ini membekukan semua utas aplikasi ketika dijalankan . Oleh itu, bukan idea yang baik untuk menggunakannya dalam aplikasi multi-threaded seperti persekitaran pelayan.
Walau bagaimanapun, terdapat ceramah yang sangat baik oleh jurutera Twitter di QCon 2012 mengenai prestasi Serial Garbage Collector - yang merupakan kaedah yang baik untuk memahami pengumpul ini dengan lebih baik.
Serial GC adalah pemungut sampah pilihan untuk kebanyakan aplikasi yang tidak mempunyai keperluan masa jeda kecil dan dijalankan pada mesin gaya pelanggan. Untuk mengaktifkan Serial Garbage Collector , kita boleh menggunakan argumen berikut:
java -XX:+UseSerialGC -jar Application.java
3.2. Pemungut Sampah Selari
Ia lalai GC daripada JVM dan kadang-kadang dipanggil Throughput Collectors. Tidak seperti Serial Garbage Collector , ini menggunakan pelbagai utas untuk menguruskan ruang timbunan . Tetapi ia juga membekukan utas aplikasi lain semasa melakukan GC .
Sekiranya kita menggunakan GC ini , kita dapat menentukan utas pengumpulan sampah maksimum dan masa jeda, throughput, dan jejak kaki (ukuran timbunan).
Bilangan utas pemungut sampah dapat dikawal dengan pilihan baris perintah -XX: ParallelGCThreads = .
Matlamat masa jeda maksimum (jurang [dalam milisaat] antara dua GC ) ditentukan dengan pilihan baris perintah -XX: MaxGCPauseMillis = .
Sasaran throughput maksimum (diukur mengenai masa yang dihabiskan untuk melakukan pengumpulan sampah berbanding masa yang dihabiskan di luar pengumpulan sampah) ditentukan oleh pilihan baris perintah -XX: GCTimeRatio =.
Jejak timbunan maksimum (jumlah memori timbunan yang diperlukan oleh program semasa berjalan) ditentukan menggunakan pilihan -Xmx.
Untuk mengaktifkan Parallel Garbage Collector , kita boleh menggunakan argumen berikut:
java -XX:+UseParallelGC -jar Application.java
3.3. Pemungut Sampah CMS
Pelaksanaan Concurrent Mark Sweep (CMS) menggunakan beberapa utas pengutip sampah untuk pengumpulan sampah. Ia direka untuk aplikasi yang lebih suka jeda pengutipan sampah yang lebih pendek, dan yang mampu berkongsi sumber pemproses dengan pemungut sampah semasa aplikasi sedang berjalan.
Ringkasnya, aplikasi yang menggunakan GC jenis ini merespons lebih lambat rata-rata tetapi tidak berhenti bertindak balas untuk melakukan pengumpulan sampah.
Satu titik cepat untuk diperhatikan di sini adalah bahawa kerana GC ini adalah serentak, permintaan pengumpulan sampah secara eksplisit seperti menggunakan System.gc () semasa proses serentak berjalan, akan mengakibatkan Kegagalan / Gangguan Mode Serentak .
Sekiranya lebih daripada 98% daripada jumlah masa dihabiskan dalam pengumpulan sampah CMS dan kurang dari 2% timbunan itu dipulihkan, maka OutOfMemoryError akan dilemparkan oleh pengumpul CMS . Sekiranya perlu, ciri ini dapat dilumpuhkan dengan menambahkan pilihan -XX: -UseGCOverheadLimit ke baris arahan.
Pengumpul ini juga memiliki mode yang dikenal sebagai mod tambahan yang tidak digunakan lagi di Java SE 8 dan mungkin dikeluarkan dalam rilis utama yang akan datang.
Untuk mengaktifkan CMS Garbage Collector , kita dapat menggunakan bendera berikut:
java -XX:+UseParNewGC -jar Application.java
Pada Java 9, pengumpul sampah CMS sudah tidak digunakan lagi . Oleh itu, JVM mencetak mesej amaran jika kami cuba menggunakannya:
>> java -XX:+UseConcMarkSweepGC --version Java HotSpot(TM) 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release. java version "9.0.1"
Lebih-lebih lagi, Java 14 sepenuhnya menurunkan sokongan CMS:
>> java -XX:+UseConcMarkSweepGC --version OpenJDK 64-Bit Server VM warning: Ignoring option UseConcMarkSweepGC; support was removed in 14.0 openjdk 14 2020-03-17
3.4. Pemungut Sampah G1
Pengumpul Sampah G1 (Garbage First) direka untuk aplikasi yang berjalan pada mesin multi-pemproses dengan ruang memori yang besar. Ia tersedia sejak JDK7 Update 4 dan dalam siaran kemudian.
Pengumpul G1 akan menggantikan pemungut CMS kerana ia lebih cekap prestasi.
Unlike other collectors, G1 collector partitions the heap into a set of equal-sized heap regions, each a contiguous range of virtual memory. When performing garbage collections, G1 shows a concurrent global marking phase (i.e. phase 1 known as Marking) to determine the liveness of objects throughout the heap.
After the mark phase is completed, G1 knows which regions are mostly empty. It collects in these areas first, which usually yields a significant amount of free space (i.e. phase 2 known as Sweeping). It is why this method of garbage collection is called Garbage-First.
To enable the G1 Garbage Collector, we can use the following argument:
java -XX:+UseG1GC -jar Application.java
3.5. Java 8 Changes
Java 8u20 telah memperkenalkan satu lagi parameter JVM untuk mengurangkan penggunaan memori yang tidak perlu dengan membuat terlalu banyak contoh String yang sama . Ini mengoptimumkan memori timbunan dengan membuang nilai String pendua ke array char tunggal global .
Parameter ini dapat diaktifkan dengan menambahkan -XX: + UseStringDeduplication sebagai parameter JVM .
4. Kesimpulan
Dalam tutorial ringkas ini, kami telah melihat pelaksanaan JVM Garbage Collection yang berbeza dan kes penggunaannya.
Dokumentasi yang lebih terperinci boleh didapati di sini.