2024-07-11
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
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:
Dalam kode sumber dasar JVM, dalam beberapa kasus khusus, pendaur ulang CMS akan memanggil pendaur ulang Serial Old.
Anda tidak bisa melihat secara langsung apa yang digunakan pengumpul sampah, Anda hanya bisa menyimpulkan berdasarkan algoritmanya.
Serial adalah aKoleksi serial single-thread generasi mudaPemulung.
Throughput luar biasa pada satu prosesor CPU
Throughput pada multi-CPU tidak sebaik pengumpul sampah lainnya (single-threaded, hanya menggunakan satu CPU). Jika heap terlalu besar, thread pengguna akan menunggu lama.
Program klien yang ditulis dalam Java atau skenario dengan konfigurasi perangkat keras terbatas (tidak banyak inti CPU)
-XX: UseSerialGC
: Baik generasi baru maupun generasi lama menggunakan serial collector.
SerialOld adalah versi generasi lama dari pengumpul sampah Serial, yang menggunakanKoleksi serial berulir tunggal
Throughput luar biasa pada satu prosesor CPU
Throughput pada multi-CPU tidak sebaik pengumpul sampah lainnya. Jika heap terlalu besar, thread pengguna akan menunggu lama.
Digunakan dengan pengumpul sampah Serial, atau dalam kasus khusus CMS
-XX: UseSerialGC
: Baik generasi baru maupun generasi lama menggunakan serial collector.
Pengumpul sampah ParNew pada dasarnya adalahOptimalisasi Serial di bawah banyak CPU, menggunakan multi-threading untuk pengumpulan sampah
-XX: UseParNewGC
: Generasi baru menggunakan kolektor ParNew, dan generasi lama menggunakan kolektor serial.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.
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)
Skenario dalam sistem Internet skala besar di mana pengguna meminta data dalam jumlah besar dan frekuensi tinggi, seperti antarmuka pesanan, antarmuka produk, dll.
XX: UseConcMarkSweepGC
, Anda dapat mengatur masing-masing kolektor generasi muda dan generasi tua.
Catatan: STW hanya akan muncul pada tahap penandaan awal dan penandaan ulang.
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:ConcGCThreads
Pengaturan 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
Akhirnya Anda bisa mendapatkan gambar ini:
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.
Pemulungan Paralel adalahPengumpul sampah generasi muda default JDK8, MultithreadKoleksi paralel,Fokus pada throughput sistem .Untuk meningkatkan throughput, PS akanSecara otomatis menyesuaikan ukuran memori heap (menyesuaikan generasi baru, ukuran memori generasi lama, ambang batas promosi)。
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.
-XX:MaxGCPauseMillis=n
Tetapkan jeda maksimum milidetik untuk setiap pengumpulan sampah-XX:GCTimeRatio=n
Atur throughput ke n (waktu eksekusi thread pengguna = n/(n 1))-XX: UseAdaptiveSizePolicy
Pengaturan 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.
Parallel Old adalah versi generasi lama yang dirancang untuk kolektor Parallel Scavenge, memanfaatkan koleksi bersamaan multi-utas.
JDK8 menetapkan parameter untuk menggunakan pendaur ulang ini secara default.
parameter:-XX: UseParallelGC
atau-XX: UseParallelOldGC
Kalian bisa menggunakan kombinasi Parallel Scavenge Parallel Old.
-XX: PrintFlagsFinal
: Anda dapat mencetak nilai akhir semua item konfigurasi saat program dimulai. Anda dapat memeriksa apakah fungsi penyesuaian otomatis diaktifkan.
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