Κοινή χρήση τεχνολογίας

[JVM Basics] Εισαγωγή στο Java Garbage Collector

2024-07-11

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

Συλλέκτης απορριμμάτων (υλοποίηση αλγορίθμου συλλογής απορριμμάτων)

Ο σκουπιδοσυλλέκτης είναι η συγκεκριμένη υλοποίηση του αλγορίθμου συλλογής απορριμμάτων . Δεδομένου ότι ο συλλέκτης σκουπιδιών χωρίζεται σε νέα και παλιά γενιά, εκτός από το G1 (που μπορεί να ελέγξει τόσο τη νέα γενιά όσο και την παλιά γενιά),Οι απορριμματοσυλλέκτες νέας και παλιάς γενιάς πρέπει να χρησιμοποιούνται σε ζευγάρια σύμφωνα με τις απαιτήσεις του hotspot.(Πρέπει να επιλέξετε τον αντίστοιχο συνδυασμό σύμφωνα με την έκδοση JDK)

Η συγκεκριμένη σχέση συνδυασμού έχει ως εξής:

Εισαγάγετε την περιγραφή της εικόνας εδώ

Στον υποκείμενο πηγαίο κώδικα του JVM, σε ορισμένες ειδικές περιπτώσεις, ο ανακυκλωτής CMS θα καλέσει το Serial Old Recycler.

Ο Άρθας βλέπει τον σκουπιδοσυλλέκτη που χρησιμοποιείται

Δεν μπορείτε να δείτε απευθείας ποιος συλλέκτης σκουπιδιών χρησιμοποιείται, μπορείτε μόνο να το συμπεράνετε με βάση τον αλγόριθμο.

Εισαγάγετε την περιγραφή της εικόνας εδώ

Young Generation-Serial Garbage Collector

Η σειρά είναι αΜονόκλωστη σειριακή συλλογή νέας γενιάςΟ συλλέκτης σκουπιδιών.

Εισαγάγετε την περιγραφή της εικόνας εδώ

Ηλικίες και αλγόριθμοι ανακύκλωσης

  • νέα γενιά
  • Αλγόριθμος αντιγραφής

πλεονέκτημα

Εξαιρετική απόδοση σε έναν μόνο επεξεργαστή CPU

έλλειψη

Η απόδοση σε πολλαπλούς επεξεργαστές δεν είναι τόσο καλή όσο οι άλλοι συλλέκτες απορριμμάτων (με ένα σπείρωμα, με χρήση μόνο ενός CPU Εάν ο σωρός είναι πολύ μεγάλος, το νήμα χρήστη θα περιμένει για μεγάλο χρονικό διάστημα).

Εφαρμόσιμη σκηνή

Προγράμματα πελάτη γραμμένα σε Java ή σενάρια με περιορισμένη διαμόρφωση υλικού (όχι πολλούς πυρήνες CPU)

πώς να χρησιμοποιήσετε

-XX: UseSerialGC: Τόσο η νέα γενιά όσο και η παλιά γενιά χρησιμοποιούν τον σειριακό συλλέκτη.

Παλιάς γενιάς-SerialOld σκουπιδοσυλλέκτης

Το SerialOld είναι η παλιά έκδοση του Serial garbage collector, χρησιμοποιώνταςΣειριακή συλλογή με ένα σπείρωμα

Εισαγάγετε την περιγραφή της εικόνας εδώ

Ηλικίες και αλγόριθμοι ανακύκλωσης

  • παλιά εποχή
  • Αλγόριθμος ταξινόμησης σήμανσης

πλεονέκτημα

Εξαιρετική απόδοση σε έναν μόνο επεξεργαστή CPU

έλλειψη

Η απόδοση με πολλούς επεξεργαστές δεν είναι τόσο καλή όσο οι άλλοι συλλέκτες σκουπιδιών Εάν ο σωρός είναι πολύ μεγάλος, το νήμα χρήστη θα περιμένει για μεγάλο χρονικό διάστημα.

Εφαρμόσιμη σκηνή

Χρησιμοποιείται με τον σειριακό συλλέκτη απορριμμάτων ή σε ειδικές θήκες CMS

πώς να χρησιμοποιήσετε

-XX: UseSerialGC: Τόσο η νέα γενιά όσο και η παλιά γενιά χρησιμοποιούν τον σειριακό συλλέκτη.

Νεαρή γενιά-Σκουπιδοσυλλέκτης ParNew

Ο σκουπιδοσυλλέκτης ParNew είναι ουσιαστικάΒελτιστοποίηση της σειράς σε πολλαπλές CPU, χρησιμοποιώντας multi-threading για τη συλλογή σκουπιδιών

Εισαγάγετε την περιγραφή της εικόνας εδώ

Ηλικία και αλγόριθμος ανακύκλωσης:

  • νέα γενιά
  • Αλγόριθμος αντιγραφής

πλεονέκτημα

  • Μικρότεροι χρόνοι παύσης σε επεξεργαστές πολλαπλών CPU

έλλειψη

  • Η απόδοση και ο χρόνος παύσης δεν είναι τόσο καλοί όσο το G1, επομένως δεν συνιστάται μετά το JDK9

Εφαρμόσιμη σκηνή

  • Στο JDK8 και σε προηγούμενες εκδόσεις, χρησιμοποιείται σε συνδυασμό με τον συλλέκτη απορριμμάτων παλιάς γενιάς CMS.

πώς να χρησιμοποιήσετε

  • -XX: UseParNewGC: Η νέα γενιά χρησιμοποιεί τον συλλέκτη ParNew και η παλιά γενιά τον σειριακό συλλέκτη.

Εισαγάγετε την περιγραφή της εικόνας εδώ

Συλλέκτης απορριμμάτων παλιάς γενιάς CMS (Concurrent Mark Sweep).

Ο συλλέκτης απορριμμάτων CMS εστιάζει στον χρόνο παύσης του συστήματος (για να ελαχιστοποιήσει το STW και να βελτιστοποιήσει την εμπειρία χρήστη),Να επιτρέπεται στα νήματα χρήστη και τα νήματα συλλογής σκουπιδιών να εκτελούνται ταυτόχρονα σε συγκεκριμένα βήματα, μειώνοντας τον χρόνο αναμονής των νημάτων χρήστη.

Ηλικίες και αλγόριθμοι ανακύκλωσης

  • παλιά εποχή
  • Αλγόριθμος επισήμανσης και σάρωσης

πλεονέκτημα

  • Ο χρόνος παύσης του συστήματος λόγω συλλογής σκουπιδιών είναι μικρότερος και η εμπειρία χρήστη είναι καλύτερη.

έλλειψη

1. Πρόβλημα κατακερματισμού μνήμης

2. Πρόβλημα υποβάθμισης (σε ορισμένες συγκεκριμένες περιπτώσεις, θα εκφυλιστεί σε συλλέκτη μονού νήματος όπως το SerialOld)

3. Πρόβλημα με τα επιπλέοντα σκουπίδια (μερικά σκουπίδια δεν μπορούν να ανακυκλωθούν κατά τη διαδικασία ανακύκλωσης)

Εφαρμόσιμη σκηνή

Σενάρια σε συστήματα Διαδικτύου μεγάλης κλίμακας όπου οι χρήστες ζητούν μεγάλες ποσότητες δεδομένων και υψηλή συχνότητα, όπως διεπαφές παραγγελιών, διεπαφές προϊόντων κ.λπ.

χρήση

XX: UseConcMarkSweepGC, μπορείτε να ορίσετε τους συλλέκτες της νέας γενιάς και της παλιάς γενιάς αντίστοιχα.

Εισαγάγετε την περιγραφή της εικόνας εδώ

Εισαγάγετε την περιγραφή της εικόνας εδώ

Βήματα εκτέλεσης CMS

  1. Αρχική σήμανση, σήμανση σε πολύ σύντομο χρονικό διάστημαΑντικείμενα με τα οποία το GC Roots μπορεί να σχετίζεται άμεσα
  2. ταυτόχρονη σήμανση, Σημειώστε όλα τα αντικείμενα , το νήμα χρήστη δεν χρειάζεται να τεθεί σε παύση. (Αν και η ταυτόχρονη σήμανση εκτελείται μαζί με το νήμα χρήστη, εάν οι πόροι που καταλαμβάνονται από την ταυτόχρονη σήμανση είναι υψηλοί, θα επηρεάσει επίσης το νήμα χρήστη)
  3. Παρατήρηση (concurrency), επειδή ορισμένα αντικείμενα θα αλλάξουν κατά τη διάρκεια της ταυτόχρονης φάσης σήμανσης, θα υπάρξει λανθασμένη επισήμανση (το αντικείμενο που χρησιμοποιήθηκε ήταν αρχικά ζωντανό, αλλά μετά τη σήμανση, το νήμα χρήστη το έκανε μη βιώσιμο, με αποτέλεσμα την εσφαλμένη επισήμανση), λείπει η ετικέτα ( Επειδή είναι ταυτόχρονα, ορισμένα αντικείμενα μπορεί να έχουν μόλις δημιουργηθεί από το νήμα χρήστη, κάτι που θα οδηγήσει σε ελλείψεις ετικετών) και άλλες καταστάσεις και πρέπει να επισημανθούν εκ νέου.
  4. Ταυτόχρονη εκκαθάριση, καθαρισμός νεκρών αντικειμένων, τα νήματα χρήστη δεν χρειάζεται να τεθούν σε παύση.

Σημείωση: Το 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 θαΑυτόματη προσαρμογή του μεγέθους της μνήμης σωρού (προσαρμογή μεγέθους μνήμης νέας γενιάς, μεγέθους μνήμης παλιάς γενιάς, όριο προώθησης)

Εισαγάγετε την περιγραφή της εικόνας εδώ

Ηλικίες και αλγόριθμοι ανακύκλωσης

  • νέα γενιά
  • Αλγόριθμος αντιγραφής

πλεονέκτημα

  • Η απόδοση είναι υψηλή και υποστηρίζει χειροκίνητη ρύθμιση παραμέτρων για τον έλεγχο της απόδοσης. Προκειμένου να βελτιωθεί η απόδοση, η εικονική μηχανή προσαρμόζει δυναμικά τις παραμέτρους του σωρού (ο χρήστης χρειάζεται μόνο να ορίσει τη διεκπεραίωση και δεν χρειάζεται να ορίσει άλλες παραμέτρους, όπως το μέγεθος της μνήμης).

έλλειψη

  • Δεν υπάρχει εγγύηση για έναν μόνο χρόνο παύσης, αλλά υποστηρίζει τη ρύθμιση του χρόνου STW.

Εφαρμόσιμη σκηνή

  • Οι εργασίες στο παρασκήνιο δεν απαιτούν αλληλεπίδραση με τον χρήστη και τείνουν να δημιουργούν μεγάλο αριθμό αντικειμένων.Για παράδειγμα: επεξεργασία μεγάλων δεδομένων, εξαγωγή μεγάλων αρχείων

Κοινές παράμετροι

Το Parallel Scavenge επιτρέπει τη χειροκίνητη ρύθμιση των μέγιστων χρόνων παύσης και απόδοσης. Οι υπεύθυνοι της Oracle συνιστούν να μην ορίσετε τη μέγιστη μνήμη σωρού κατά τη χρήση αυτού του συνδυασμού.

  • μέγιστος χρόνος παύσης,-XX:MaxGCPauseMillis=n Ορίστε τα μέγιστα χιλιοστά του δευτερολέπτου παύσης για κάθε συλλογή σκουπιδιών
  • διακίνηση,-XX:GCTimeRatio=n Ορίστε την απόδοση σε n (χρόνος εκτέλεσης νήματος χρήστη = n/(n 1))
  • Αυτόματη προσαρμογή του μεγέθους της μνήμης, -XX: UseAdaptiveSizePolicyΗ ρύθμιση επιτρέπει στον συλλέκτη απορριμμάτων να προσαρμόζει αυτόματα το μέγεθος της μνήμης με βάση την απόδοση και τη μέγιστη παύση χιλιοστών του δευτερολέπτου Αυτή η παράμετρος είναι ενεργοποιημένη από προεπιλογή (η Oracle συνιστά να μην ορίζετε τη μέγιστη τιμή της μνήμης σωρού και να αφήνετε τον συλλέκτη απορριμμάτων να προσαρμόζεται αυτόματα. )

Σημείωση: Οι δύο δείκτες του μέγιστου χρόνου παύσης και της απόδοσης βρίσκονται σε σύγκρουση. , θυσιάζοντας την απόδοση.Εάν θέλετε να ρυθμίσετε τον μέγιστο χρόνο παύσης και τη διεκπεραίωση ταυτόχρονα, πρέπει να κάνετε περισσότερες δοκιμές για να τα κάνετε πιο συντονισμένα.

Παλιά γενιά-Παράλληλος Παλιός απορριμματιστής

Το Parallel Old είναι μια έκδοση παλιάς γενιάς σχεδιασμένη για τον συλλέκτη Parallel Scavenge, χρησιμοποιώντας ταυτόχρονη συλλογή πολλαπλών νημάτων.

Εισαγάγετε την περιγραφή της εικόνας εδώ

Ηλικίες και αλγόριθμοι ανακύκλωσης

  • παλιά εποχή
  • Αλγόριθμος ταξινόμησης σημαδιών (στην πραγματικότητα ταξινόμηση σημαδιών)

πλεονέκτημα

  • Η ταυτόχρονη συλλογή είναι πιο αποτελεσματική σε επεξεργαστές πολλαπλών πυρήνων

έλλειψη

  • Ο χρόνος παύσης θα είναι μεγαλύτερος

Εφαρμόσιμη σκηνή

  • Χρησιμοποιείται με 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