2. Ποιες περιοχές περιλαμβάνονται στην περιοχή δεδομένων χρόνου εκτέλεσης;
3. Ποια δεδομένα αποθηκεύονται στη στοίβα και στο σωρό αντίστοιχα;
4. Γιατί πρέπει να αντικαταστήσουμε τη μόνιμη γενιά (PermGen) με τον μεταχώρο (MetaSpace);
5. Κατανοείτε τη βασική δομή του χώρου σωρού; Κάτω από ποιες συνθήκες θα εισέλθει ένα αντικείμενο στην παλιά γενιά;
6. Σε ποια περιοχή μνήμης τοποθετούνται μεγάλα αντικείμενα;
7. Ποια είναι η διαδικασία δημιουργίας αντικειμένων Java;
Ερώτηση απάντηση
1. Από ποια μέρη αποτελείται το JVM;
Απάντηση: Το JVM είναι ένα εκτελέσιμοbytecode εικονικός υπολογιστής αρχείων (.class), ο οποίος παρέχει επίσης διαχείριση μνήμης, συλλογή σκουπιδιών και άλλους μηχανισμούς. Περιλαμβάνει τα ακόλουθα κύρια μέρη.
Υποσύστημα φόρτωσης κλάσης: Υπεύθυνο για τη φόρτωση αρχείων bytecode (.class) στο JVM.
Περιοχή δεδομένων χρόνου εκτέλεσης: είναι η περιοχή μνήμης που χρησιμοποιείται από το JVM κατά την εκτέλεση.
Μηχανή εκτέλεσης: Υπεύθυνος για την ερμηνεία ή τη μεταγλώττιση του bytecode σε κώδικα μηχανής για την εκτέλεση του επεξεργαστή.
Διεπαφή εγγενούς βιβλιοθήκης: Παρέχει ένα σύνολο API για την κλήση εγγενών βιβλιοθηκών γραμμένων στο λειτουργικό σύστημα ή σε άλλες γλώσσες.
2. Ποιες περιοχές περιλαμβάνονται στην περιοχή δεδομένων χρόνου εκτέλεσης;
Απάντηση: Η περιοχή δεδομένων χρόνου εκτέλεσης είναι η περιοχή μνήμης που εκχωρείται από το JVM κατά την εκτέλεση ενός προγράμματος Java.
Μετρητής προγράμματος: Είναι ένας μικρός χώρος μνήμης και είναι η διεύθυνση της εντολής bytecode που εκτελείται αυτήν τη στιγμή από το νήμα. Εάν το νήμα εκτελεί μια εγγενή μέθοδο, η τιμή αυτού του μετρητή δεν έχει οριστεί.
Στοίβα εικονικής μηχανής Java: Κάθε νήμα θα δημιουργήσει μια στοίβα εικονικής μηχανής όταν δημιουργηθεί, η οποία χρησιμοποιείται για την αποθήκευση του τοπικού πίνακα μεταβλητών του νήματος, του πλαισίου τελεστών, της δυναμικής σύνδεσης, των πληροφοριών εξόδου μεθόδου κ.λπ. Η στοίβα εικονικής μηχανής Java περιέχει πολλαπλά πλαίσια στοίβας Η διαδικασία από κάθε μέθοδο που καλείται μέχρι την ολοκλήρωση της εκτέλεσης αντιστοιχεί στη διαδικασία από την ώθηση ενός πλαισίου στοίβας στη στοίβα στην εικονική μηχανή.
Στοίβα εγγενών μεθόδων: Είναι ο χώρος που προετοιμάζεται από το JVM για την εκτέλεση των εγγενών μεθόδων. Έχει παρόμοιες λειτουργίες με τη στοίβα εικονικής μηχανής Java.
Σωρός: χρησιμοποιείται για την αποθήκευση σχεδόν όλων των στιγμιότυπων αντικειμένων και συστοιχιών και είναι η κύρια περιοχή όπου λειτουργεί ο συλλέκτης απορριμμάτων.
Περιοχή μεθόδου: χρησιμοποιείται για την αποθήκευση πληροφοριών κλάσης, σταθερών, στατικών μεταβλητών, κώδικα που μεταγλωττίζεται από τον μεταγλωττιστή just-in-time, κ.λπ. που φορτώνεται από το JVM. Πριν από το JDK1.8, εφαρμόστηκε ως μόνιμη γενιά. Ξεκινώντας από το JDK1.8, η μόνιμη γενιά αντικαθίσταται από τον αρχικό χώρο. Το Metaspace χρησιμοποιεί τοπική μνήμη αντί για μνήμη σωρού.
3. Ποια δεδομένα αποθηκεύονται στη στοίβα και στο σωρό αντίστοιχα;
Απάντηση: Δεδομένα που είναι αποθηκευμένα στη στοίβα (στοίβα εικονικής μηχανής Java):
Πίνακας τοπικών μεταβλητών: Χρησιμοποιείται κυρίως για την αποθήκευση παραμέτρων μεθόδου και οι τοπικές μεταβλητές εντός της μεθόδου περιλαμβάνουν βασικούς τύπους δεδομένων και αναφορές αντικειμένων.
Στοίβα χειριστή: χρησιμοποιείται για την προσωρινή αποθήκευση οδηγιών λειτουργίας και ενδιάμεσων αποτελεσμάτων κατά την εκτέλεση της μεθόδου.
Δυναμική σύνδεση: Μια αναφορά στο σταθερό pool της κλάσης στην οποία ανήκει η μέθοδος, που χρησιμοποιείται για την επίλυση αναφορών συμβόλων στη μέθοδο.
Διεύθυνση επιστροφής μεθόδου: αποθηκεύει τη διεύθυνση της επόμενης εντολής που εκτελείται μετά την κλήση της μεθόδου. Δεδομένα αποθηκευμένα στο σωρό:
Παράδειγμα αντικειμένου: Μια παρουσία αντικειμένου που δημιουργείται μέσω της νέας λέξης-κλειδιού στο πρόγραμμα, συμπεριλαμβανομένων των ιδιοτήτων και των μεθόδων του αντικειμένου.
Πίνακας: Όλοι οι τύποι πινάκων, συμπεριλαμβανομένων των πινάκων βασικού τύπου και των πινάκων αντικειμένων.
4. Γιατί πρέπει να αντικαταστήσουμε τη μόνιμη γενιά (PermGen) με τον μεταχώρο (MetaSpace);
Απάντηση: Η αντικατάσταση της μόνιμης γενιάς με το metaspace είναι κυρίως για την επίλυση ορισμένων εγγενών προβλημάτων και περιορισμών της μόνιμης γενιάς και τη βελτίωση της απόδοσης και της ευελιξίας του JVM.
Βελτιώστε την ευελιξία και την αποτελεσματικότητα της διαχείρισης της μνήμης: Το μέγεθος της μνήμης της μόνιμης δημιουργίας ορίζεται κατά την εκκίνηση του JVM και δεν μπορεί να προσαρμοστεί δυναμικά. Το Metaspace χρησιμοποιεί τοπική μνήμη αντί για μνήμη σωρού Java και το μέγεθός του μπορεί να προσαρμοστεί δυναμικά ανάλογα με τις ανάγκες.
Λύστε το πρόβλημα της εκφόρτωσης τάξης και της συλλογής σκουπιδιών: η συμπεριφορά GC της μόνιμης γενιάς είναι πολύπλοκη και απρόβλεπτη και η απόδοση ανακύκλωσης χαμηλή.
Παροχή καλύτερης απόδοσης και σταθερότητας: Η χρήση του metaspace κάνει τη διαχείριση της μνήμης JVM πιο ενοποιημένη και συνεπή, επειδή η διαχείριση του metaspace, όπως και άλλες περιοχές μνήμης, γίνεται με χρήση τοπικής μνήμης. Αυτό απλοποιεί τις στρατηγικές διαχείρισης μνήμης και βελτιώνει τη συνολική απόδοση και σταθερότητα.
Απλοποιήστε τη διαχείριση της μνήμης JVM
5. Καταλαβαίνετε τη βασική δομή του χώρου του σωρού; Κάτω από ποιες συνθήκες θα εισέλθει ένα αντικείμενο στην παλιά γενιά;
Απάντηση: Η βασική δομή του χώρου σωρού αποτελείται κυρίως από τη νέα γενιά, την παλιά γενιά και τη μόνιμη γενιά. Μετά το JDK8, η μόνιμη γενιά αντικαθίσταται από το metaspace και χρησιμοποιεί τοπική μνήμη για αποθήκευση.
Καινοζωική γενιά: Η πρόοδος της νέας γενιάς υποδιαιρείται στην περιοχή της Εδέμ και σε δύο περιοχές επιζώντων (Survivor 0 και Survivor 1)
Περιοχή Eden: Τα αντικείμενα που δημιουργήθηκαν πρόσφατα εκχωρούν πρώτα τη μνήμη στην περιοχή Eden.
Περιοχή Survivor (S0, S1): χρησιμοποιείται για την αποθήκευση αντικειμένων που επέζησαν από τη συλλογή σκουπιδιών νέας γενιάς. Μετά από κάθε Minor GC, τα σωζόμενα αντικείμενα θα αντιγράφονται εμπρός και πίσω μεταξύ αυτών των δύο περιοχών.
Παλιά γενιά: Αντικείμενα που είναι ακόμα ζωντανά μετά από πολλαπλά Μικρά GC. Η συλλογή απορριμμάτων (Major GC ή Full GC) πραγματοποιείται λιγότερο συχνά στην παλιά γενιά.
Μόνιμη παραγωγή/μεταχώρος: χρησιμοποιείται για την αποθήκευση μεταδεδομένων κλάσεων, συμπεριλαμβανομένων ορισμών κλάσεων, σταθερών, στατικών μεταβλητών, μεταγλωττισμένου κώδικα ακριβώς στην ώρα, κ.λπ.
Η κατάσταση όταν το αντικείμενο βρίσκεται στην παλιά γενιά:
Συμπληρώθηκε το όριο ηλικίας: Κάθε αντικείμενο έχει μια ηλικία κατά την οποία εκχωρείται η μνήμη στη νέα γενιά και η ηλικία θα αυξάνεται κατά 1 μετά από κάθε Μικρό GC. Όταν η ηλικία φτάσει σε ένα συγκεκριμένο όριο (η προεπιλογή είναι 15), το αντικείμενο θα προωθηθεί στην παλιά γενιά.
Μεγάλο αντικείμενο: Εάν το αντικείμενο είναι πολύ μεγάλο και υπερβαίνει το όριο που έχει οριστεί από το JVM, το αντικείμενο θα εκχωρήσει απευθείας χώρο στην παλιά γενιά.
Ανεπαρκής χώρος στην περιοχή Survivor: Εάν η περιοχή επιζώντος δεν έχει αρκετό χώρο για να φιλοξενήσει όλα τα σωζόμενα αντικείμενα κατά τη διάρκεια του Minor GC, αυτά τα αντικείμενα θα είναι
Προσδιορισμός ηλικίας δυναμικού αντικειμένου: Εάν το μέγεθος όλων των αντικειμένων της ίδιας ηλικίας στο χώρο του Survivor υπερβαίνει το μισό του χώρου του Survivor, τότε τα αντικείμενα των οποίων η ηλικία είναι μεγαλύτερη ή ίση με αυτήν την ηλικία μπορούν να εισέλθουν απευθείας στην παλιά γενιά.
// 动态年龄计算代码
uint ageTable::compute_tenuring_threshold(size_t survivor_capacity){//survivor_capacity是survivor空间的大小size_t desired_survivor_size =(size_t)((((double) survivor_capacity)*TargetSurvivorRatio)/100);//TargetSurvivorRatio 为50size_t total =0;
uint age =1;while(age < table_size){
total += sizes[age];//sizes数组是每个年龄段对象大小if(total > desired_survivor_size)break;
age++;}
uint result = age < MaxTenuringThreshold ? age : MaxTenuringThreshold;...}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
6. Σε ποια περιοχή μνήμης τοποθετούνται μεγάλα αντικείμενα;
Απάντηση: Τα μεγάλα αντικείμενα (πολύ μεγάλοι πίνακες και συμβολοσειρές) συνήθως εκχωρούνται απευθείας στην περιοχή μνήμης παλιάς γενιάς.Αυτό γίνεται για να αποτραπεί η συχνή εμφάνιση της νέας γενιάςΣυλλογή απορριμάτωνΑυτή τη στιγμή, μεγάλα αντικείμενα αντιγράφονται συχνά μεταξύ της περιοχής Eden και της περιοχής Survivor, βελτιώνοντας έτσι την αποτελεσματικότητα συλλογής σκουπιδιών. Διαμορφώστε το κατώφλι για μεγάλα αντικείμενα ώστε να εισέλθουν απευθείας στην παλιά γενιά:
7. Ποια είναι η διαδικασία δημιουργίας αντικειμένων Java;
απάντηση:
Έλεγχος φόρτωσης τάξης
Εάν η κλάση δεν έχει φορτωθεί, συνδεθεί και αρχικοποιηθεί, το JVM θα φορτώσει πρώτα την κλάση. Αυτό περιλαμβάνει τα ακόλουθα βήματα:
Φόρτωση: Διαβάστε το αρχείο κλάσης μέσω του φορτωτή κλάσης και φορτώστε τον bytecode της κλάσης στη μνήμη.
Σύνδεση: περιλαμβάνει τρία στάδια: επαλήθευση, προετοιμασία και ανάλυση. Επαληθεύστε την ορθότητα των αρχείων κλάσης, προετοιμάστε στατικές μεταβλητές της κλάσης και εκχωρήστε μνήμη και επιλύστε τις αναφορές συμβόλων σε άμεσες αναφορές.
Αρχικοποίηση: Εκτελέστε το μπλοκ στατικής αρχικοποίησης της κλάσης και την προετοιμασία των στατικών μεταβλητών.
κατανομή μνήμης
Το JVM εκχωρεί μνήμη για νέα αντικείμενα στο σωρό. Το μέγεθος της εκχωρημένης μνήμης καθορίζεται από τη δομή του αντικειμένου, συμπεριλαμβανομένης της κεφαλίδας του αντικειμένου και των δεδομένων παρουσίας.
Το JVM έχει δύο βασικούς τρόπους εκχώρησης μνήμης:
Bump-the-pointer: Εάν η μνήμη σωρού είναι κανονική, ο δείκτης εκχώρησης χρειάζεται μόνο να μετακινηθεί μια καθορισμένη απόσταση στην περιοχή ελεύθερης μνήμης.
Δωρεάν λίστα: Εάν η μνήμη του σωρού είναι ακανόνιστη, το JVM πρέπει να διατηρεί μια ελεύθερη λίστα και να βρει το κατάλληλο μπλοκ από τη δωρεάν λίστα κατά την εκχώρηση μνήμης.
αρχικοποίηση σε μηδενική τιμή
Το JVM θα αρχικοποιήσει όλες τις μεταβλητές παρουσίας του αντικειμένου στις προεπιλεγμένες τιμές τους. Για παράδειγμα, οι μεταβλητές αριθμητικού τύπου θα αρχικοποιηθούν σε 0, οι μεταβλητές τύπου Boole σε false και οι μεταβλητές τύπου αναφοράς σε null.
Ορισμός κεφαλίδας αντικειμένου
Ρυθμίστε τις πληροφορίες κεφαλίδας αντικειμένου στο χώρο μνήμης του αντικειμένου, ο οποίος περιλαμβάνει τον κατακερματισμό του αντικειμένου, την ηλικία δημιουργίας GC, τη σημαία κατάστασης κλειδώματος, το κλείδωμα που κρατά το νήμα, το αναγνωριστικό μεροληπτικού νήματος κ.λπ.
Αρχικοποίηση κατασκευαστή
Καλέστε τον κατασκευαστή του αντικειμένου για να ολοκληρώσετε την προετοιμασία του αντικειμένου. Αυτό περιλαμβάνει την εκτέλεση ρητών λειτουργιών αρχικοποίησης σε μεταβλητές στιγμιότυπου καθώς και κώδικα στο σώμα του κατασκευαστή. Τα συγκεκριμένα βήματα είναι τα εξής:
Εκτελέστε το μπλοκ αρχικοποίησης στιγμιότυπου της κλάσης.
Εκτελέστε τη μέθοδο κατασκευής της γονικής κλάσης από πάνω προς τα κάτω σύμφωνα με την ιεραρχία κληρονομικότητας.
Αρχικοποίηση μεταβλητών στιγμιότυπου σε ρητά καθορισμένες τιμές.
Εκτελέστε το κύριο μέρος της μεθόδου κατασκευής της κλάσης.