2024-07-11
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Ο σκουπιδοσυλλέκτης είναι η συγκεκριμένη υλοποίηση του αλγορίθμου συλλογής απορριμμάτων . Δεδομένου ότι ο συλλέκτης σκουπιδιών χωρίζεται σε νέα και παλιά γενιά, εκτός από το G1 (που μπορεί να ελέγξει τόσο τη νέα γενιά όσο και την παλιά γενιά),Οι απορριμματοσυλλέκτες νέας και παλιάς γενιάς πρέπει να χρησιμοποιούνται σε ζευγάρια σύμφωνα με τις απαιτήσεις του hotspot.(Πρέπει να επιλέξετε τον αντίστοιχο συνδυασμό σύμφωνα με την έκδοση JDK)
Η συγκεκριμένη σχέση συνδυασμού έχει ως εξής:
Στον υποκείμενο πηγαίο κώδικα του JVM, σε ορισμένες ειδικές περιπτώσεις, ο ανακυκλωτής CMS θα καλέσει το Serial Old Recycler.
Δεν μπορείτε να δείτε απευθείας ποιος συλλέκτης σκουπιδιών χρησιμοποιείται, μπορείτε μόνο να το συμπεράνετε με βάση τον αλγόριθμο.
Η σειρά είναι αΜονόκλωστη σειριακή συλλογή νέας γενιάςΟ συλλέκτης σκουπιδιών.
Εξαιρετική απόδοση σε έναν μόνο επεξεργαστή CPU
Η απόδοση σε πολλαπλούς επεξεργαστές δεν είναι τόσο καλή όσο οι άλλοι συλλέκτες απορριμμάτων (με ένα σπείρωμα, με χρήση μόνο ενός CPU Εάν ο σωρός είναι πολύ μεγάλος, το νήμα χρήστη θα περιμένει για μεγάλο χρονικό διάστημα).
Προγράμματα πελάτη γραμμένα σε Java ή σενάρια με περιορισμένη διαμόρφωση υλικού (όχι πολλούς πυρήνες CPU)
-XX: UseSerialGC
: Τόσο η νέα γενιά όσο και η παλιά γενιά χρησιμοποιούν τον σειριακό συλλέκτη.
Το SerialOld είναι η παλιά έκδοση του Serial garbage collector, χρησιμοποιώνταςΣειριακή συλλογή με ένα σπείρωμα
Εξαιρετική απόδοση σε έναν μόνο επεξεργαστή CPU
Η απόδοση με πολλούς επεξεργαστές δεν είναι τόσο καλή όσο οι άλλοι συλλέκτες σκουπιδιών Εάν ο σωρός είναι πολύ μεγάλος, το νήμα χρήστη θα περιμένει για μεγάλο χρονικό διάστημα.
Χρησιμοποιείται με τον σειριακό συλλέκτη απορριμμάτων ή σε ειδικές θήκες CMS
-XX: UseSerialGC
: Τόσο η νέα γενιά όσο και η παλιά γενιά χρησιμοποιούν τον σειριακό συλλέκτη.
Ο σκουπιδοσυλλέκτης ParNew είναι ουσιαστικάΒελτιστοποίηση της σειράς σε πολλαπλές CPU, χρησιμοποιώντας multi-threading για τη συλλογή σκουπιδιών
-XX: UseParNewGC
: Η νέα γενιά χρησιμοποιεί τον συλλέκτη ParNew και η παλιά γενιά τον σειριακό συλλέκτη.Ο συλλέκτης απορριμμάτων CMS εστιάζει στον χρόνο παύσης του συστήματος (για να ελαχιστοποιήσει το STW και να βελτιστοποιήσει την εμπειρία χρήστη),Να επιτρέπεται στα νήματα χρήστη και τα νήματα συλλογής σκουπιδιών να εκτελούνται ταυτόχρονα σε συγκεκριμένα βήματα, μειώνοντας τον χρόνο αναμονής των νημάτων χρήστη.
1. Πρόβλημα κατακερματισμού μνήμης
2. Πρόβλημα υποβάθμισης (σε ορισμένες συγκεκριμένες περιπτώσεις, θα εκφυλιστεί σε συλλέκτη μονού νήματος όπως το SerialOld)
3. Πρόβλημα με τα επιπλέοντα σκουπίδια (μερικά σκουπίδια δεν μπορούν να ανακυκλωθούν κατά τη διαδικασία ανακύκλωσης)
Σενάρια σε συστήματα Διαδικτύου μεγάλης κλίμακας όπου οι χρήστες ζητούν μεγάλες ποσότητες δεδομένων και υψηλή συχνότητα, όπως διεπαφές παραγγελιών, διεπαφές προϊόντων κ.λπ.
XX: UseConcMarkSweepGC
, μπορείτε να ορίσετε τους συλλέκτες της νέας γενιάς και της παλιάς γενιάς αντίστοιχα.
Σημείωση: Το STW θα εμφανίζεται μόνο κατά τις φάσεις αρχικής σήμανσης και επανασήμανσης.
έλλειψη:
1. Το CMS χρησιμοποιεί έναν αλγόριθμο σήμανσης και διαγραφής Μετά την ολοκλήρωση της συλλογής σκουπιδιών, θα εμφανιστεί ένας μεγάλος αριθμός θραυσμάτων μνήμης για να μην επηρεαστεί η κατανομή των αντικειμένων.Το CMS θα ανασυγκροτηθεί κατά τη διάρκεια του Full GC. . Αυτό θα προκαλέσει παύση του νήματος χρήστη,Μπορείτε να χρησιμοποιήσετε την παράμετρο -XX:CMSFullGCsBeforeCompaction=N (προεπιλογή 0) για να προσαρμόσετε το Full GC N φορές πριν το ταξινομήσετε.。
2. Δεν είναι δυνατός ο χειρισμός των "αιωρούμενων σκουπιδιών" που δημιουργούνται κατά τη διάρκεια της ταυτόχρονης διαδικασίας καθαρισμού και δεν είναι δυνατή η πλήρης συλλογή απορριμμάτων (κατά τη διάρκεια αυτής της διαδικασίας καθαρισμού, το νήμα χρήστη δημιούργησε ορισμένα αντικείμενα ταυτόχρονα, αλλά δεν χρησιμοποιήθηκαν ξανά σύντομα. Αυτά τα αντικείμενα δεν είναι ανακυκλώνεται σε αυτόν τον καθαρισμό και πρέπει να περιμένει μέχρι τον επόμενο καθαρισμό, γι' αυτό ονομάζεται αιωρούμενο σκουπίδι).
3. Εάν δεν υπάρχει επαρκής μνήμη στην παλιά γενιά για την εκχώρηση αντικειμένων, το CMS θα εκφυλιστεί σε Serial Old single-thread ανακυκλώνοντας την παλιά γενιά.
Αριθμός ταυτόχρονων νημάτων:
Ο αριθμός των νημάτων κατά την εκτέλεση της ταυτόχρονης φάσης στο CMS μπορεί να περάσει-XX:ConcGCThreads
Ρύθμιση παραμέτρων, που υπολογίζεται από το σύστημα, ο τύπος υπολογισμού είναι(-XX:ParallelGCThreads定义的线程数 3) / 4
, ParallelGCThreads είναι ο αριθμός των παράλληλων νημάτων μετά την παύση STW
Τα ParallelGCThreads καθορίζονται από τον αριθμό των πυρήνων του επεξεργαστή:
1. Όταν ο αριθμός των πυρήνων CPU είναι μικρότερος από 8, ParallelGCThreads = Αριθμός πυρήνων CPU
2. Διαφορετικά ParallelGCThreads = 8 (Αριθμός πυρήνων CPU – 8)*5/8
Υπάρχουν 12 λογικοί επεξεργαστές στον υπολογιστή μου, οπότε ParallelGCThreads = 8 (12 - 8) * 5/8 = 10, ConcGCThreads = (-XX: Ο αριθμός των νημάτων που ορίζεται από ParallelGCThreads 3) / 4 = (10 3) / 4 = 3
Τέλος, μπορείτε να πάρετε αυτή την εικόνα:
Η ταυτόχρονη σήμανση και η ταυτόχρονη φάση καθαρισμού θα υποβληθούν σε επεξεργασία παράλληλα με τη χρήση τριών νημάτων. Η φάση επανασήμανσης θα υποβληθεί σε επεξεργασία χρησιμοποιώντας 10 νήματα. Δεδομένου ότι ο αριθμός των πυρήνων της CPU είναι περιορισμένος, η ταυτόχρονη φάση θα επηρεάσει την απόδοση της εκτέλεσης νημάτων χρήστη.
Το Parallel Scavenge είναιJDK8 προεπιλεγμένος συλλέκτης σκουπιδιών νέας γενιάς,ΠολυνηματικήΠαράλληλη συλλογή,Εστίαση στην απόδοση του συστήματος .Προκειμένου να αυξηθεί η απόδοση, το PS θαΑυτόματη προσαρμογή του μεγέθους της μνήμης σωρού (προσαρμογή μεγέθους μνήμης νέας γενιάς, μεγέθους μνήμης παλιάς γενιάς, όριο προώθησης)。
Το Parallel Scavenge επιτρέπει τη χειροκίνητη ρύθμιση των μέγιστων χρόνων παύσης και απόδοσης. Οι υπεύθυνοι της Oracle συνιστούν να μην ορίσετε τη μέγιστη μνήμη σωρού κατά τη χρήση αυτού του συνδυασμού.
-XX:MaxGCPauseMillis=n
Ορίστε τα μέγιστα χιλιοστά του δευτερολέπτου παύσης για κάθε συλλογή σκουπιδιών-XX:GCTimeRatio=n
Ορίστε την απόδοση σε n (χρόνος εκτέλεσης νήματος χρήστη = n/(n 1))-XX: UseAdaptiveSizePolicy
Η ρύθμιση επιτρέπει στον συλλέκτη απορριμμάτων να προσαρμόζει αυτόματα το μέγεθος της μνήμης με βάση την απόδοση και τη μέγιστη παύση χιλιοστών του δευτερολέπτου Αυτή η παράμετρος είναι ενεργοποιημένη από προεπιλογή (η Oracle συνιστά να μην ορίζετε τη μέγιστη τιμή της μνήμης σωρού και να αφήνετε τον συλλέκτη απορριμμάτων να προσαρμόζεται αυτόματα. )Σημείωση: Οι δύο δείκτες του μέγιστου χρόνου παύσης και της απόδοσης βρίσκονται σε σύγκρουση. , θυσιάζοντας την απόδοση.Εάν θέλετε να ρυθμίσετε τον μέγιστο χρόνο παύσης και τη διεκπεραίωση ταυτόχρονα, πρέπει να κάνετε περισσότερες δοκιμές για να τα κάνετε πιο συντονισμένα.
Το Parallel Old είναι μια έκδοση παλιάς γενιάς σχεδιασμένη για τον συλλέκτη Parallel Scavenge, χρησιμοποιώντας ταυτόχρονη συλλογή πολλαπλών νημάτων.
Το JDK8 ορίζει παραμέτρους για χρήση αυτού του ανακυκλωτή από προεπιλογή.
παράμετρος:-XX: UseParallelGC
ή-XX: UseParallelOldGC
Μπορείτε να χρησιμοποιήσετε τον συνδυασμό Parallel Scavenge Parallel Old.
-XX: PrintFlagsFinal
: Μπορείτε να εκτυπώσετε τις τελικές τιμές όλων των στοιχείων διαμόρφωσης κατά την έναρξη του προγράμματος. Μπορείτε να ελέγξετε εάν η λειτουργία αυτόματης ρύθμισης είναι ενεργοποιημένη.
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