Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Πώς μπορώ να διαμορφώσω τις παραμέτρους JVM για να ελαχιστοποιήσω τις παύσεις της συλλογής σκουπιδιών


Πώς μπορώ να διαμορφώσω τις παραμέτρους JVM για να ελαχιστοποιήσω τις παύσεις της συλλογής σκουπιδιών


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

Επιλογή του σωστού συλλέκτη σκουπιδιών

Το JVM προσφέρει πολλούς αλγόριθμους συλλογής σκουπιδιών, ο καθένας με διαφορετικά χαρακτηριστικά σχετικά με τη διακίνηση, τους χρόνους παύσης και τη χρήση πόρων:

- Serial GC: Χρησιμοποιεί ένα μόνο νήμα για το GC. Σταματά όλα τα νήματα εφαρμογής κατά τη συλλογή, με αποτέλεσμα μεγάλες παύσεις. Γενικά δεν είναι κατάλληλο για την ελαχιστοποίηση των παύσεων σε μεγαλύτερες εφαρμογές.
- Παράλληλο GC: Χρησιμοποιεί πολλαπλά σπειρώματα για να εκτελέσει συλλογή απορριμμάτων, μειώνοντας τους χρόνους παύσης σε σύγκριση με το σειριακό GC αξιοποιώντας πολλαπλούς πυρήνες CPU. Είναι προσανατολισμένο στην απόδοση, αλλά εξακολουθεί να παύει τα νήματα εφαρμογής κατά τη διάρκεια της GC.
- Ταυτόχρονα Mark-Sweep (CMS) GC: Εκτελεί μεγάλο μέρος της εργασίας συλλογής σκουπιδιών ταυτόχρονα με την εφαρμογή, μειώνοντας σημαντικά τους χρόνους παύσης μόνο εν συντομία παίζοντας την εφαρμογή σε συγκεκριμένες φάσεις GC. Είναι κατάλληλο για εφαρμογές χαμηλής καθυστέρησης.
- Τα σκουπίδια πρώτα (G1) GC: χωρίζουν το σωρό σε περιοχές και επικεντρώνεται στη συλλογή περιοχών με τα περισσότερα σκουπίδια πρώτα. Στόχος του είναι να παρέχει προβλέψιμες ώρες παύσης και καλή απόδοση με ανάμειξη ταυτόχρονων και παράλληλων φάσεων. Είναι συχνά η προεπιλογή στις σύγχρονες εκδόσεις JVM.
- Shenandoah και ZGC: Αυτοί οι συλλέκτες χαμηλής καθυστέρησης εκτελούν το σύνολο ή τις περισσότερες εργασίες GC ταυτόχρονα, στοχεύοντας σε πολύ σύντομες ή σχεδόν ανεπαίσθητες παύσεις, κατάλληλες για μεγάλες σωρούς και εξαιρετικά ανταποκρινόμενες εφαρμογές.

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

Διαμόρφωση μεγέθους σωρού

Το μέγεθος του σωρού έχει άμεσο αντίκτυπο στη συχνότητα GC και τις διάρκειες παύσης:

-Ρυθμίστε το αρχικό και μέγιστο μέγεθος σωρού ίσο: χρησιμοποιώντας `-xms` και` -xmx` με την ίδια τιμή αποφεύγει το μέγεθος του σωρού, η οποία μπορεί να εισαγάγει παύσεις κατά τη διάρκεια του χρόνου εκτέλεσης.
- ΑΝΘΡΩΠΙΝΟ Μέγεθος σωρού: Η υπο-διανομή σωρού προκαλεί συχνές συλλογές, αυξάνοντας τις παύσεις. Ωστόσο, η υπερβολική διανομή οδηγεί σε μεγαλύτερους κύκλους GC. Βρείτε μια ισορροπία που βασίζεται στις ανάγκες μνήμης εφαρμογών.
- Παρακολουθήστε τα αρχεία καταγραφής GC και τις μετρήσεις χρήσης σωρού για να ρυθμίσετε κατάλληλα το μέγεθος του σωρού.

Έλεγχος χρόνου παύσης GC

Το JVM παρέχει παραμέτρους για να ορίσετε στόχους για μέγιστες ώρες παύσης GC:

- `-xx: maxgcpausemillis =`: Ορίζει έναν μέγιστο χρόνο παύσης στόχου σε χιλιοστά του δευτερολέπτου για τον συλλέκτη να προσπαθήσει να συναντηθεί. Αν και δεν είναι εγγυημένη, η JVM προσπαθεί να προσαρμόσει την απόδοση και την εργασία GC για να αποφευχθεί η υπέρβαση αυτού του χρόνου παύσης.
- Χρησιμοποιήστε αυτήν την παράμετρο με G1 GC ή άλλους συλλέκτες που υποστηρίζουν στόχους παύσης χρόνου για να καθοδηγήσουν το JVM στην εξισορρόπηση της απόδοσης και της καθυστέρησης.

σπειρώματα και παραλληλισμό

Η αξιοποίηση πολλαπλών νημάτων κατά τη διάρκεια της συλλογής σκουπιδιών μειώνει τις διάρκειες παύσης:

- `-xx: parallelgCThreads =`: Ορίζει τον αριθμό των νημάτων που χρησιμοποιούνται κατά τη διάρκεια των παράλληλων φάσεων του GC. Περισσότερα νήματα μπορούν να μειώσουν το χρόνο παύσης, αλλά μπορούν επίσης να αυξήσουν τη χρήση της CPU.
- `-xx: concgCTeRads =`: Για ταυτόχρονα συλλέκτες όπως το CMS και το G1, ορίζει τον αριθμό των νημάτων που εκτελούν ταυτόχρονες φάσεις.
- Ο βέλτιστος αριθμός νήματος θα πρέπει να ευθυγραμμιστεί με τον αριθμό των διαθέσιμων πυρήνων CPU και του φόρτου εργασίας. Η υπερκάλυψη των νημάτων μπορεί να υποβαθμίσει την απόδοση.

ρύθμιση νέων και παλιών μεγεθών γενιάς

Ο σωρός συνήθως χωρίζεται σε γενιές νέους και ηλικιωμένους. Ο συντονισμός των μεγεθών τους επηρεάζει τη συμπεριφορά GC:

- Μέγεθος νέας γενιάς: Η μεγαλύτερη νεαρή γενιά μειώνει τη συχνότητα των μικρών GCs αλλά αυξάνει τους μικρούς χρόνους παύσης GC. Ρυθμίστε με βάση το ποσοστό κατανομής αντικειμένων.
- Μέγεθος παλιάς γενιάς: επηρεάζει πόσο συχνά τρέχουν οι κύριες/πλήρεις GC και η διάρκεια τους.
- Το G1 GC διαιρεί το σωρό σε πολλές περιοχές εξίσου μεγέθους και διαχειρίζεται το μέγεθος δυναμικά, αλλά επιτρέπει τα όρια ρύθμισης της έναρξης με παραμέτρους όπως το `-xx: initiatingheapoccupancypercent '.

Ειδικές παραμέτρους συλλέκτη σκουπιδιών

Για το G1 GC, που χρησιμοποιείται συνήθως στα σύγχρονα JVMS:
- `-xx:+useg1gc`: Ενεργοποιεί το G1 GC.
- `-xx: maxgcpausemillis =`: Παύση χρόνου στόχου.
- `-xx: initiatingHeapoccupancyPercent =`: ξεκινά ταυτόχρονη σήμανση όταν ο σωρός φτάσει σε αυτή την πληρότητα.
- `-xx:+usestringdedupplication`: Μειώνει το αποτύπωμα μνήμης από deduplicating χορδές.
- Αποφύγετε ρητά τη ρύθμιση του μεγέθους της νέας γενιάς, καθώς μπορεί να παρεμβαίνει στους στόχους της παύσης της G1.

Για CMS GC:
- `-xx:+useconcmarksweepgc`: Ενεργοποιεί το CMS.
-Ο συντονισμός επικεντρώνεται στη μείωση της παγκόσμιας παύσης της παγκόσμιας παύσης, προσαρμόζοντας το κατώφλι εκκίνησης και τον αριθμό των νημάτων.

Για παράλληλη GC (προσανατολισμένη στην απόδοση):
-`-xx:+useparallelgc` και` -xx:+useparalleloldgc`: επιτρέπει την παράλληλη GC για νέες και παλιές γενιές.
- Συντονίστε τον αριθμό των νημάτων GC με `-xx: parallelgcthreads`.

μείωση του ποσοστού κατανομής αντικειμένων

Μείωση του ρυθμού με τον οποίο δημιουργούνται νέα αντικείμενα μειώνουν την πίεση GC:

- Προφίλ και βελτιστοποίηση κώδικα για να ελαχιστοποιήσετε την περιττή δημιουργία αντικειμένων.
- Χρησιμοποιήστε τη συγκέντρωση και επαναχρησιμοποίηση αντικειμένων όταν είναι δυνατόν.
- Ρυθμίστε τις παραμέτρους JVM για τη ρύθμιση των περιοχών εσωτερικής μνήμης για καλύτερα πρότυπα κατανομής αντικειμένων.

Αποφύγετε ρητές κλήσεις GC

- Απενεργοποίηση ρητών κλήσεων GC από κωδικό εφαρμογής ή εξωτερικά εργαλεία που μπορούν να προκαλέσουν πλήρεις παύσεις GC χρησιμοποιώντας `-xx:+disableexplicitgc`.

Παρακολούθηση και καταγραφή

Για να κατανοήσετε και να συντονίσετε τη συμπεριφορά GC, ενεργοποιήστε λεπτομερή καταγραφή GC:

- Χρησιμοποιήστε το `-xlog: GC*` σε JVMS που υποστηρίζει την ενοποιημένη καταγραφή (Java 9+).
-σε παλαιότερα JVMS, χρησιμοποιήστε `-xx:+printgcdetails -xx:+printgcdatestamps -xloggc:`.

Αναλύστε τα αρχεία καταγραφής για να εντοπίσετε τις αιτίες παύσης και να συντονιστείτε ανάλογα.

Γενικές συστάσεις

- Ξεκινήστε τον συντονισμό με καθαρό σχιστόλιθο αφαιρώντας τα ξεπερασμένα επιχειρήματα JVM.
- Μεταβολές δοκιμών σε περιβάλλον παραγωγής.
- Χρησιμοποιήστε εργαλεία όπως η Java Flight Recorder, το VisualVM ή οι εμπορικοί προφίλ για να συγκεντρώσετε δεδομένα χρήσης GC και μνήμης.
- Επαναφορά βήματα συντονισμού με βάση τους παρατηρούμενες ώρες παύσης GC, την απόδοση και την ανταπόκριση της εφαρμογής.

Συνοπτικά, η ελαχιστοποίηση των παύσεων της συλλογής σκουπιδιών JVM περιλαμβάνει την επιλογή του κατάλληλου συλλέκτη απορριμμάτων (κατά προτίμηση G1, ZGC ή shenandoah για τις απαιτήσεις χαμηλής παύσης), κατάλληλα μεγέθους σωρού και γενεών, ορίζοντας στόχους παύσης, συντονίζοντας τα σπειρώματα ταυτόχρονα, ελαχιστοποιώντας το ποσοστό κατανομής αντικειμένων, την απελευθέρωση των ρολογιών GCS και την προσεκτική παρακολούθηση. Οι λεπτομέρειες θα εξαρτηθούν από το φόρτο εργασίας της εφαρμογής, το μέγεθος του σωρού, την έκδοση JVM και τα χαρακτηριστικά υλικού. Οι προσαρμογές θα πρέπει να γίνονται σταδιακά και να επικυρωθούν με εργαλεία παρακολούθησης και λεπτομερή αρχεία καταγραφής GC για να επιτευχθεί η επιθυμητή ισορροπία της παραγωγής και του χρόνου παύσης.

Αυτή η προσέγγιση εξασφαλίζει ότι η συλλογή σκουπιδιών της JVM λειτουργεί αποτελεσματικά με ελάχιστες διαταραχές στην απόδοση των εφαρμογών.