Pengumpul Sampah JVM

1. Ikhtisar

Dalam tutorial singkat ini, kami akan menunjukkan dasar-dasar implementasi JVM Garbage Collection (GC) yang berbeda . Selain itu, kami akan mengetahui cara mengaktifkan jenis Pengumpulan Sampah tertentu dalam aplikasi kami.

2. Pengantar Singkat tentang Pengumpulan Sampah

Dari namanya, Garbage Collection berhubungan dengan mencari dan menghapus sampah dari memori. Namun, pada kenyataannya, Pengumpulan Sampah melacak setiap objek yang tersedia di ruang heap JVM dan menghapus yang tidak digunakan.

Dengan kata sederhana, GC bekerja dalam dua langkah sederhana yang dikenal sebagai Mark and Sweep:

  • Mark - ini adalah tempat pengumpul sampah mengidentifikasi bagian memori mana yang digunakan dan mana yang tidak
  • Sapu - langkah ini menghapus objek yang diidentifikasi selama fase "tandai"

Keuntungan:

  • Tidak ada alokasi memori manual / penanganan deallocation karena ruang memori yang tidak terpakai secara otomatis ditangani oleh GC
  • Tidak ada overhead penanganan Menggantung Pointer
  • Manajemen Kebocoran Memori Otomatis ( GC sendiri tidak dapat menjamin solusi pembuktian penuh untuk kebocoran memori, namun, GC menangani sebagian besar darinya)

Kekurangan:

  • Karena JVM harus melacak pembuatan / penghapusan referensi objek, aktivitas ini membutuhkan lebih banyak daya CPU selain aplikasi asli. Ini dapat mempengaruhi kinerja permintaan yang membutuhkan memori besar
  • Pemrogram tidak memiliki kendali atas penjadwalan waktu CPU yang didedikasikan untuk membebaskan objek yang tidak lagi diperlukan
  • Menggunakan beberapa implementasi GC dapat mengakibatkan aplikasi berhenti tiba-tiba
  • Manajemen memori otomatis tidak akan seefisien alokasi / deallocation memori manual yang tepat

3. Penerapan GC

JVM memiliki empat jenis implementasi GC :

  • Serial Pengumpul Sampah
  • Pengumpul Sampah Paralel
  • Pengumpul Sampah CMS
  • G1 Pengumpul Sampah

3.1. Serial Pengumpul Sampah

Ini adalah implementasi GC paling sederhana, karena pada dasarnya berfungsi dengan satu utas. Akibatnya, penerapan GC ini membekukan semua utas aplikasi saat dijalankan . Oleh karena itu, bukanlah ide yang baik untuk menggunakannya dalam aplikasi multi-thread seperti lingkungan server.

Namun, ada pembicaraan yang sangat bagus oleh para insinyur Twitter di QCon 2012 tentang kinerja Pengumpul Sampah Serial - yang merupakan cara yang baik untuk memahami kolektor ini dengan lebih baik.

GC Serial adalah pengumpul sampah pilihan untuk sebagian besar aplikasi yang tidak memiliki persyaratan waktu jeda yang kecil dan berjalan di mesin bergaya klien. Untuk mengaktifkan Serial Garbage Collector , kita dapat menggunakan argumen berikut:

java -XX:+UseSerialGC -jar Application.java

3.2. Pengumpul Sampah Paralel

Ini default GC dari JVM dan kadang-kadang disebut throughput Kolektor. Tidak seperti Serial Garbage Collector , ini menggunakan banyak utas untuk mengelola ruang heap . Tapi itu juga membekukan utas aplikasi lain saat melakukan GC .

Jika kita menggunakan GC ini , kita bisa menentukan thread pengumpulan sampah maksimum dan waktu jeda, throughput, dan footprint (ukuran heap).

Jumlah utas pengumpul sampah dapat dikontrol dengan opsi baris perintah -XX: ParallelGCThreads = .

Tujuan waktu jeda maksimum (jarak [dalam milidetik] antara dua GC ) ditentukan dengan opsi baris perintah -XX: MaxGCPauseMillis = .

Target throughput maksimum (diukur berdasarkan waktu yang dihabiskan untuk melakukan pengumpulan sampah versus waktu yang dihabiskan di luar pengumpulan sampah) ditentukan oleh opsi baris perintah -XX: GCTimeRatio =.

Footprint heap maksimum (jumlah memori heap yang diperlukan program saat berjalan) ditentukan menggunakan opsi -Xmx.

Untuk mengaktifkan Parallel Garbage Collector , kita dapat menggunakan argumen berikut:

java -XX:+UseParallelGC -jar Application.java

3.3. Pengumpul Sampah CMS

The Concurrent Mark Sweep (CMS) implementasi menggunakan beberapa thread pengumpul sampah untuk pengumpulan sampah. Ini dirancang untuk aplikasi yang lebih memilih jeda pengumpulan sampah yang lebih singkat, dan yang mampu berbagi sumber daya prosesor dengan pengumpul sampah saat aplikasi berjalan.

Simply put, applications using this type of GC respond slower on average but do not stop responding to perform garbage collection.

A quick point to note here is that since this GC is concurrent, an invocation of explicit garbage collection such as using System.gc() while the concurrent process is working, will result in Concurrent Mode Failure / Interruption.

If more than 98% of the total time is spent in CMS garbage collection and less than 2% of the heap is recovered, then an OutOfMemoryError is thrown by the CMScollector. If necessary, this feature can be disabled by adding the option -XX:-UseGCOverheadLimit to the command line.

This collector also has a mode knows as an incremental mode which is being deprecated in Java SE 8 and may be removed in a future major release.

To enable the CMS Garbage Collector, we can use the following flag:

java -XX:+UseParNewGC -jar Application.java

As of Java 9, the CMS garbage collector has been deprecated. Therefore, JVM prints a warning message if we try to use it:

>> 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"

Moreover, Java 14 completely dropped the CMS support:

>> 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. G1 Garbage Collector

G1 (Garbage First) Garbage Collector is designed for applications running on multi-processor machines with large memory space. It's available since JDK7 Update 4 and in later releases.

G1 collector will replace the CMS collector since it's more performance efficient.

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 mengurangi penggunaan memori yang tidak perlu dengan membuat terlalu banyak instance dari String yang sama . Ini mengoptimalkan memori heap dengan menghapus nilai String duplikat ke array char [] tunggal global .

Parameter ini dapat diaktifkan dengan menambahkan -XX: + UseStringDeduplication sebagai parameter JVM .

4. Kesimpulan

Dalam tutorial singkat ini, kita telah melihat berbagai implementasi JVM Garbage Collection dan kasus penggunaannya.

Dokumentasi lebih rinci dapat ditemukan di sini.