Berbagi teknologi

[Dasar-Dasar JVM] Pengantar Java Garbage Collector

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Pengumpul sampah (implementasi algoritma pengumpulan sampah)

Pengumpul sampah adalah implementasi spesifik dari algoritma pengumpulan sampah . Karena pemulung terbagi menjadi generasi muda dan generasi tua, selain G1 (yang dapat mengontrol generasi baru dan generasi lama),Pengumpul sampah generasi baru dan generasi lama harus digunakan berpasangan sesuai dengan kebutuhan hotspot.(Anda harus memilih kombinasi yang sesuai sesuai dengan versi JDK)

Hubungan kombinasi spesifiknya adalah sebagai berikut:

Masukkan deskripsi gambar di sini

Dalam kode sumber dasar JVM, dalam beberapa kasus khusus, pendaur ulang CMS akan memanggil pendaur ulang Serial Old.

Arthas melihat pengumpul sampah yang digunakan

Anda tidak bisa melihat secara langsung apa yang digunakan pengumpul sampah, Anda hanya bisa menyimpulkan berdasarkan algoritmanya.

Masukkan deskripsi gambar di sini

Pengumpul Sampah Serial Generasi Muda

Serial adalah aKoleksi serial single-thread generasi mudaPemulung.

Masukkan deskripsi gambar di sini

Mendaur ulang usia dan algoritma

  • generasi muda
  • Algoritma replikasi

keuntungan

Throughput luar biasa pada satu prosesor CPU

kekurangan

Throughput pada multi-CPU tidak sebaik pengumpul sampah lainnya (single-threaded, hanya menggunakan satu CPU). Jika heap terlalu besar, thread pengguna akan menunggu lama.

Adegan yang berlaku

Program klien yang ditulis dalam Java atau skenario dengan konfigurasi perangkat keras terbatas (tidak banyak inti CPU)

Cara Penggunaan

-XX: UseSerialGC: Baik generasi baru maupun generasi lama menggunakan serial collector.

Generasi lama-SerialPengumpul sampah lama

SerialOld adalah versi generasi lama dari pengumpul sampah Serial, yang menggunakanKoleksi serial berulir tunggal

Masukkan deskripsi gambar di sini

Mendaur ulang usia dan algoritma

  • usia tua
  • Algoritma pengumpulan tanda

keuntungan

Throughput luar biasa pada satu prosesor CPU

kekurangan

Throughput pada multi-CPU tidak sebaik pengumpul sampah lainnya. Jika heap terlalu besar, thread pengguna akan menunggu lama.

Adegan yang berlaku

Digunakan dengan pengumpul sampah Serial, atau dalam kasus khusus CMS

Cara Penggunaan

-XX: UseSerialGC: Baik generasi baru maupun generasi lama menggunakan serial collector.

Generasi muda-Pemungut sampah ParNew

Pengumpul sampah ParNew pada dasarnya adalahOptimalisasi Serial di bawah banyak CPU, menggunakan multi-threading untuk pengumpulan sampah

Masukkan deskripsi gambar di sini

Usia dan algoritma daur ulang:

  • generasi muda
  • Algoritma replikasi

keuntungan

  • Waktu jeda lebih singkat pada prosesor multi-CPU

kekurangan

  • Throughput dan waktu jeda tidak sebaik G1, jadi tidak disarankan setelah JDK9

Adegan yang berlaku

  • Di JDK8 dan versi sebelumnya, ini digunakan bersama dengan pengumpul sampah CMS generasi lama.

Cara Penggunaan

  • -XX: UseParNewGC: Generasi baru menggunakan kolektor ParNew, dan generasi lama menggunakan kolektor serial.

Masukkan deskripsi gambar di sini

Pengumpul sampah CMS (Concurrent Mark Sweep) generasi lama

Pengumpul sampah CMS berfokus pada waktu jeda sistem (untuk meminimalkan STW dan mengoptimalkan pengalaman pengguna),Izinkan thread pengguna dan thread pengumpulan sampah untuk dijalankan secara bersamaan dalam langkah-langkah tertentu, mengurangi waktu tunggu thread pengguna.

Mendaur ulang usia dan algoritma

  • usia tua
  • Algoritma tandai dan sapu

keuntungan

  • Waktu jeda sistem karena pengumpulan sampah lebih singkat dan pengalaman pengguna lebih baik.

kekurangan

1. Masalah fragmentasi memori

2. Masalah degradasi (dalam beberapa kasus tertentu, ini akan berubah menjadi kolektor berulir tunggal seperti SerialOld)

3. Masalah sampah terapung (sebagian sampah tidak dapat didaur ulang selama proses daur ulang)

Adegan yang berlaku

Skenario dalam sistem Internet skala besar di mana pengguna meminta data dalam jumlah besar dan frekuensi tinggi, seperti antarmuka pesanan, antarmuka produk, dll.

menggunakan

XX: UseConcMarkSweepGC, Anda dapat mengatur masing-masing kolektor generasi muda dan generasi tua.

Masukkan deskripsi gambar di sini

Masukkan deskripsi gambar di sini

Langkah-langkah eksekusi CMS

  1. Penandaan awal, penandaan dalam waktu yang sangat singkatObjek yang dapat dihubungkan langsung dengan GC Roots
  2. penandaan bersamaan, Tandai semua objek , thread pengguna tidak perlu dijeda. (Meskipun penandaan serentak dijalankan bersama dengan thread pengguna, jika sumber daya yang ditempati oleh penandaan serentak tinggi, hal ini juga akan memengaruhi thread pengguna)
  3. Remarking (konkurensi), karena beberapa objek akan berubah selama fase penandaan bersamaan, akan terjadi kesalahan pelabelan (objek yang digunakan awalnya hidup, tetapi setelah penandaan, thread pengguna membuatnya tidak dapat hidup, mengakibatkan kesalahan pelabelan), pelabelan hilang ( Karena ini terjadi secara bersamaan, beberapa objek mungkin baru saja dibuat oleh utas pengguna, yang akan menyebabkan hilangnya tag) dan situasi lainnya, dan perlu ditandai ulang.
  4. Pembersihan serentak, membersihkan benda mati, thread pengguna tidak perlu dijeda.

Catatan: STW hanya akan muncul pada tahap penandaan awal dan penandaan ulang.

Masukkan deskripsi gambar di sini

kekurangan:

1. CMS menggunakan algoritma mark-and-clear. Setelah pengumpulan sampah selesai, sejumlah besar fragmen memori akan muncul agar tidak mempengaruhi alokasi objek.CMS akan melakukan defragmentasi selama Full GC. . Ini akan menyebabkan thread pengguna terhenti,Anda dapat menggunakan parameter -XX:CMSFullGCsBeforeCompaction=N (default 0) untuk menyesuaikan waktu GC Penuh N sebelum memilahnya.

2. Tidak dapat menangani "sampah mengambang" yang dihasilkan selama proses pembersihan bersamaan, dan tidak dapat mencapai pengumpulan sampah lengkap (selama proses pembersihan ini, thread pengguna membuat beberapa objek secara bersamaan, tetapi objek tersebut tidak segera digunakan lagi. Objek-objek ini Tidak didaur ulang pada pembersihan ini dan perlu menunggu hingga pembersihan berikutnya, sehingga disebut sampah terapung).

3. Jika generasi lama tidak memiliki cukup memori untuk mengalokasikan objek, CMS akan berubah menjadi Serial Old single-thread yang mendaur ulang generasi lama.

Jumlah thread bersamaan:

Jumlah thread saat menjalankan fase bersamaan di CMS dapat dilewati-XX:ConcGCThreadsPengaturan parameter, dihitung oleh sistem, rumus perhitungannya adalah(-XX:ParallelGCThreads定义的线程数 3) / 4, ParallelGCThreads adalah jumlah thread paralel setelah jeda STW

ParallelGCThreads ditentukan oleh jumlah inti prosesor:

1. Jika jumlah inti CPU kurang dari 8, ParallelGCThreads = Jumlah inti CPU

2. Jika tidak, ParallelGCThreads = 8 (Jumlah inti CPU – 8)*5/8

Ada 12 prosesor logis di komputer saya, jadi ParallelGCThreads = 8 (12 - 8) * 5/8 = 10, ConcGCThreads = (-XX: Jumlah thread yang ditentukan oleh ParallelGCThreads 3) / 4 = (10 3) / 4 = 3

Masukkan deskripsi gambar di sini

Akhirnya Anda bisa mendapatkan gambar ini:

Masukkan deskripsi gambar di sini

Tahap penandaan dan pembersihan bersamaan akan diproses secara paralel menggunakan tiga utas. Tahap penandaan ulang akan diproses menggunakan 10 thread. Karena jumlah inti CPU terbatas, fase bersamaan akan mempengaruhi kinerja eksekusi thread pengguna.

Masukkan deskripsi gambar di sini

Pemulung Sampah Paralel Generasi Muda

Pemulungan Paralel adalahPengumpul sampah generasi muda default JDK8, MultithreadKoleksi paralelFokus pada throughput sistem .Untuk meningkatkan throughput, PS akanSecara otomatis menyesuaikan ukuran memori heap (menyesuaikan generasi baru, ukuran memori generasi lama, ambang batas promosi)

Masukkan deskripsi gambar di sini

Mendaur ulang usia dan algoritma

  • generasi muda
  • Algoritma replikasi

keuntungan

  • Throughputnya tinggi, dan mendukung pengaturan parameter manual untuk mengontrol throughput. Untuk meningkatkan throughput, mesin virtual secara dinamis menyesuaikan parameter heap (pengguna hanya perlu mengatur throughput, dan tidak perlu mengatur parameter lain seperti ukuran memori).

kekurangan

  • Tidak ada jaminan waktu jeda tunggal, namun mendukung pengaturan waktu STW.

Adegan yang berlaku

  • Tugas latar belakang tidak memerlukan interaksi pengguna dan cenderung menghasilkan objek dalam jumlah besar.Misalnya: pemrosesan data besar, ekspor file besar

Parameter umum

Parallel Scavenge memungkinkan pengaturan manual waktu jeda dan throughput maksimum. Pejabat Oracle menyarankan untuk tidak menyetel memori heap maksimum saat menggunakan kombinasi ini. Pengumpul sampah akan secara otomatis menyesuaikan ukuran memori berdasarkan waktu jeda dan throughput maksimum.

  • waktu jeda maksimum,-XX:MaxGCPauseMillis=n Tetapkan jeda maksimum milidetik untuk setiap pengumpulan sampah
  • keluaran,-XX:GCTimeRatio=n Atur throughput ke n (waktu eksekusi thread pengguna = n/(n 1))
  • Secara otomatis menyesuaikan ukuran memori, -XX: UseAdaptiveSizePolicyPengaturan memungkinkan pengumpul sampah untuk secara otomatis menyesuaikan ukuran memori berdasarkan throughput dan jeda maksimum milidetik. Parameter ini diaktifkan secara default (Oracle menyarankan bahwa saat menggunakan kombinasi PS, jangan menetapkan nilai maksimum memori heap dan biarkan pengumpul sampah secara otomatis menyesuaikan )

Catatan: Dua indikator waktu jeda maksimum dan throughput berada dalam konflik. Pengumpul sampah akan berusaha semaksimal mungkin untuk memenuhi waktu jeda maksimum (terkadang disetel terlalu kecil dan tidak dapat dipenuhi, dan waktu jeda maksimum yang ditetapkan akan terlampaui) , mengorbankan throughput.Jika Anda ingin mengatur waktu jeda dan throughput maksimum secara bersamaan, Anda perlu melakukan lebih banyak pengujian agar lebih terkoordinasi.

Generasi lama-Paralel Pengumpul sampah tua

Parallel Old adalah versi generasi lama yang dirancang untuk kolektor Parallel Scavenge, memanfaatkan koleksi bersamaan multi-utas.

Masukkan deskripsi gambar di sini

Mendaur ulang usia dan algoritma

  • usia tua
  • Algoritma mark-collation (sebenarnya pengurutan mark-clearing)

keuntungan

  • Pengumpulan secara bersamaan lebih efisien pada CPU multi-core

kekurangan

  • Waktu jeda akan lebih lama

Adegan yang berlaku

  • Digunakan dengan Pemulungan Paralel

Cara Penggunaan

JDK8 menetapkan parameter untuk menggunakan pendaur ulang ini secara default.

parameter:-XX: UseParallelGC atau-XX: UseParallelOldGCKalian bisa menggunakan kombinasi Parallel Scavenge Parallel Old.
Masukkan deskripsi gambar di sini

Masukkan deskripsi gambar di sini

tes

-XX: PrintFlagsFinal: Anda dapat mencetak nilai akhir semua item konfigurasi saat program dimulai. Anda dapat memeriksa apakah fungsi penyesuaian otomatis diaktifkan.

Masukkan deskripsi gambar di sini

Masukkan deskripsi gambar di sini

Masukkan deskripsi gambar di sini

Masukkan deskripsi gambar di sini

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 垃圾回收器案例3
 */
//-XX: UseSerialGC -Xmn1g -Xmx16g -XX:SurvivorRatio=8  -XX: PrintGCDetails -verbose:gc -XX: PrintFlagsFinal
//-XX: UseParNewGC  -Xmn1g -Xmx16g -XX:SurvivorRatio=8  -XX: PrintGCDetails -verbose:gc
//-XX: UseConcMarkSweepGC
//-XX: UseG1GC   -Xmn8g -Xmx16g -XX:SurvivorRatio=8  -XX: PrintGCDetails -verbose:gc MaxGCPauseMillis
//-XX: PrintFlagsFinal  -XX:GCTimeRatio = 19  -XX:MaxGCPauseMillis=10 -XX: UseAdaptiveSizePolicy
public class GcDemo2 {

    public static void main(String[] args) throws IOException {
        int count = 0;
        List