Προγραμματισμός

Τι είναι το JVM; Παρουσιάζοντας την εικονική μηχανή Java

Το Java Virtual Machine είναι ένα πρόγραμμα με σκοπό την εκτέλεση άλλων προγραμμάτων. Είναι μια απλή ιδέα που αποτελεί επίσης ένα από τα μεγαλύτερα παραδείγματα κωδικοποίησης Κουνγκ φου. Το JVM αναστάτωσε το status quo για την ώρα του και συνεχίζει να υποστηρίζει την καινοτομία προγραμματισμού σήμερα.

Σε ποιες περιπτώσεις χρησιμοποιείται το JVM

Το JVM έχει δύο κύριες λειτουργίες: να επιτρέπει στα προγράμματα Java να εκτελούνται σε οποιαδήποτε συσκευή ή λειτουργικό σύστημα (γνωστό ως αρχή "Γράψε μια φορά, εκτελέστε οπουδήποτε") και διαχειριστείτε και βελτιστοποιήσετε τη μνήμη προγραμμάτων. Όταν η Java κυκλοφόρησε το 1995, όλα τα προγράμματα υπολογιστή γράφτηκαν σε ένα συγκεκριμένο λειτουργικό σύστημα και η μνήμη του προγράμματος διαχειρίστηκε ο προγραμματιστής λογισμικού. Έτσι, το JVM ήταν μια αποκάλυψη.

JavaWorld /

Έχοντας έναν τεχνικό ορισμό για το JVM είναι χρήσιμο και υπάρχει επίσης ένας καθημερινός τρόπος που το σκέφτονται οι προγραμματιστές λογισμικού. Ας τα αναλύσουμε:

  • Τεχνικός ορισμός: Το JVM είναι η προδιαγραφή για ένα πρόγραμμα λογισμικού που εκτελεί κώδικα και παρέχει το περιβάλλον χρόνου εκτέλεσης για αυτόν τον κώδικα.
  • Καθημερινός ορισμός: Το JVM είναι ο τρόπος με τον οποίο εκτελούμε τα προγράμματα Java. Διαμορφώνουμε τις ρυθμίσεις του JVM και στη συνέχεια βασιζόμαστε σε αυτό για τη διαχείριση των πόρων του προγράμματος κατά την εκτέλεση.

Όταν οι προγραμματιστές μιλούν για το JVM, εννοούμε συνήθως τη διαδικασία που εκτελείται σε έναν υπολογιστή, ειδικά σε έναν διακομιστή, που αντιπροσωπεύει και ελέγχει τη χρήση πόρων για μια εφαρμογή Java. Αντίθεση σε αυτό στο Προδιαγραφή JVM, το οποίο περιγράφει τις απαιτήσεις για τη δημιουργία ενός προγράμματος που εκτελεί αυτές τις εργασίες.

Ποιος αναπτύσσει και διατηρεί το JVM;

Το JVM αναπτύσσεται ευρέως, χρησιμοποιείται πολύ και συντηρείται από μερικούς πολύ φωτεινούς προγραμματιστές, τόσο εταιρικούς όσο και ανοιχτού κώδικα. Το έργο OpenJDK είναι ο απόγονος της απόφασης της Sun Microsystems για Java ανοιχτού κώδικα. Το OpenJDK συνεχίστηκε μέσω της διαχείρισης της Java από την Oracle, με το μεγαλύτερο μέρος της ανύψωσης αυτές τις μέρες να γίνεται από μηχανικούς της Oracle.

Διαχείριση μνήμης στο JVM

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

Συλλογή απορριμάτων

Πριν από την Java, η διαχείριση της μνήμης όλων των προγραμμάτων από τον προγραμματιστή. Στην Java, η μνήμη προγράμματος διαχειρίζεται ο JVM. Το JVM διαχειρίζεται τη μνήμη μέσω μιας διαδικασίας που ονομάζεται συλλογή απορριμάτων, η οποία αναγνωρίζει και εξαλείφει συνεχώς τη μη χρησιμοποιημένη μνήμη σε προγράμματα Java. Η συλλογή απορριμμάτων συμβαίνει μέσα σε ένα τρέχον JVM.

Τις πρώτες μέρες, η Java δέχτηκε πολλές κριτικές για το ότι δεν ήταν τόσο "κοντά στο μέταλλο" όσο το C ++ και επομένως δεν ήταν τόσο γρήγορη. Η διαδικασία συλλογής απορριμμάτων ήταν ιδιαίτερα αμφιλεγόμενη. Έκτοτε, μια ποικιλία αλγορίθμων και προσεγγίσεων έχουν προταθεί και χρησιμοποιηθεί για τη συλλογή απορριμμάτων. Με συνεπή ανάπτυξη και βελτιστοποίηση, η συλλογή απορριμμάτων έχει βελτιωθεί σημαντικά.

Τι σημαίνει «κοντά στο μέταλλο»;

Όταν οι προγραμματιστές λένε ότι μια γλώσσα ή πλατφόρμα προγραμματισμού είναι "κοντά στο μέταλλο", εννοούμε ότι ο προγραμματιστής μπορεί να προγραμματίσει (γράφοντας κώδικα) μέσω προγραμματισμού τη μνήμη ενός λειτουργικού συστήματος. Θεωρητικά, οι προγραμματιστές μπορούν να βελτιώσουν την απόδοση από τα προγράμματά μας καθορίζοντας πόσο χρησιμοποιείται και πότε να το απορρίψουν. Στις περισσότερες περιπτώσεις, η ανάθεση της διαχείρισης μνήμης σε μια εξαιρετικά εκλεπτυσμένη διαδικασία όπως η JVM αποδίδει καλύτερη απόδοση και λιγότερα σφάλματα από το να το κάνετε μόνοι σας.

Η JVM σε τρία μέρη

Θα μπορούσε να ειπωθεί ότι υπάρχουν τρεις πτυχές στο JVM: προδιαγραφή, εφαρμογή και παράδειγμα. Ας εξετάσουμε κάθε ένα από αυτά.

1. Η προδιαγραφή JVM

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

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

J.S. Ο Μπαχ περιέγραψε κάποτε τη δημιουργία μουσικής με παρόμοιο τρόπο:

"Το μόνο που έχετε να κάνετε είναι να αγγίξετε το δεξί πλήκτρο τη σωστή στιγμή."

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

Το JVM ως εικονική μηχανή

Το JVM είναι ένα εικονική μηχανή που εκτελεί αρχεία κλάσης Java με φορητό τρόπο. Το να είσαι εικονική μηχανή σημαίνει ότι το JVM είναι μια αφαίρεση ενός υποκείμενου, πραγματικού μηχανήματος - όπως ο διακομιστής στον οποίο εκτελείται το πρόγραμμά σας. Ανεξάρτητα από το λειτουργικό σύστημα ή το υλικό που υπάρχει στην πραγματικότητα, το JVM δημιουργεί ένα προβλέψιμο περιβάλλον για την εκτέλεση προγραμμάτων. Σε αντίθεση με μια πραγματική εικονική μηχανή, ωστόσο, η JVM δεν δημιουργεί ένα εικονικό λειτουργικό σύστημα. Θα ήταν πιο ακριβές να περιγράψετε το JVM ως περιβάλλον διαχείρισης χρόνου εκτέλεσης, ή α επεξεργασία εικονικής μηχανής.

2. Εφαρμογές JVM

Η εφαρμογή των προδιαγραφών JVM οδηγεί σε ένα πραγματικό πρόγραμμα λογισμικού, το οποίο είναι μια εφαρμογή JVM. Στην πραγματικότητα, υπάρχουν πολλές υλοποιήσεις JVM, τόσο ανοιχτού κώδικα όσο και ιδιοκτησίας. Το HotSpot JVM του OpenJDK είναι η εφαρμογή αναφοράς και παραμένει μια από τις πιο καλά δοκιμασμένες και δοκιμασμένες βάσεις κώδικα στον κόσμο. Το HotSpot είναι επίσης το JVM που χρησιμοποιείται πιο συχνά.

Σχεδόν όλα τα JVM με άδεια έχουν δημιουργηθεί ως πιρούνια από το OpenJDK και το HotSpot JVM, συμπεριλαμβανομένου του JDK με άδεια της Oracle. Οι προγραμματιστές που δημιουργούν ένα εξουσιοδοτημένο πιρούνι από το OpenJDK συχνά ενθαρρύνονται από την επιθυμία να προσθέσουν βελτιώσεις απόδοσης για λειτουργικό σύστημα. Συνήθως, πραγματοποιείτε λήψη και εγκατάσταση του JVM ως μέρος του Java Runtime Environment (JRE).

3. Μια παρουσία JVM

Μετά την εφαρμογή και την κυκλοφορία των προδιαγραφών JVM ως προϊόν λογισμικού, μπορείτε να το κατεβάσετε και να το εκτελέσετε ως πρόγραμμα. Αυτό το πρόγραμμα που κατεβάσατε είναι μια παρουσία (ή instantiated version) του JVM.

Τις περισσότερες φορές, όταν οι προγραμματιστές μιλούν για το "JVM", αναφερόμαστε σε μια παρουσία JVM που εκτελείται σε περιβάλλον ανάπτυξης λογισμικού ή παραγωγής. Ίσως να πείτε, "Γεια σου Anand, πόση μνήμη χρησιμοποιεί το JVM σε αυτόν τον διακομιστή;" ή, "Δεν μπορώ να πιστέψω ότι δημιούργησα μια κυκλική κλήση και το σφάλμα υπερχείλισης στοίβας έριξε το JVM μου. Τι λάθος αρχάριος!"

Τι είναι μια προδιαγραφή λογισμικού;

ΕΝΑ προδιαγραφές λογισμικού (ή προδιαγραφή) είναι ένα έγγραφο αναγνώσιμο από τον άνθρωπο που περιγράφει τον τρόπο λειτουργίας ενός συστήματος λογισμικού. Ο σκοπός μιας προδιαγραφής είναι να δημιουργήσει μια σαφή περιγραφή και απαιτήσεις για τους κωδικούς στους μηχανικούς.

Φόρτωση και εκτέλεση αρχείων τάξης στο JVM

Έχουμε μιλήσει για το ρόλο του JVM στην εκτέλεση εφαρμογών Java, αλλά πώς εκτελεί τη λειτουργία του; Για την εκτέλεση εφαρμογών Java, το JVM εξαρτάται από τον φορτωτή κλάσης Java και μια μηχανή εκτέλεσης Java.

Ο φορτωτής κλάσης Java στο JVM

Όλα στην Java είναι μια τάξη και όλες οι εφαρμογές Java δημιουργούνται από τάξεις. Μια εφαρμογή μπορεί να αποτελείται από μία τάξη ή χιλιάδες. Για να εκτελέσετε μια εφαρμογή Java, ένα JVM πρέπει να φορτώσει μεταγλωττισμένα αρχεία .class σε ένα περιβάλλον, όπως ένας διακομιστής, στον οποίο μπορούν να έχουν πρόσβαση. Ένα JVM εξαρτάται από τον φορτωτή κλάσης για να εκτελέσει αυτήν τη λειτουργία.

Το Java class loader είναι το μέρος του JVM που φορτώνει τάξεις στη μνήμη και τις καθιστά διαθέσιμες για εκτέλεση. Οι φορτωτές τάξης χρησιμοποιούν τεχνικές όπως τεμπέλης φόρτωσης και προσωρινής αποθήκευσης για να κάνουν τη φόρτωση τάξης όσο πιο αποτελεσματική μπορεί. Τούτου λεχθέντος, η φόρτωση κατηγορίας δεν είναι το επικό εγκεφαλικό teaser που (ας πούμε) η φορητή διαχείριση μνήμης χρόνου εκτέλεσης, οπότε οι τεχνικές είναι συγκριτικά απλές.

Κάθε εικονική μηχανή Java περιλαμβάνει έναν φορτωτή κλάσης. Η προδιαγραφή JVM περιγράφει τυπικές μεθόδους για ερωτήματα και χειρισμό του φορτωτή κλάσης κατά το χρόνο εκτέλεσης, αλλά οι υλοποιήσεις JVM είναι υπεύθυνες για την εκπλήρωση αυτών των δυνατοτήτων. Από την οπτική γωνία του προγραμματιστή, οι μηχανισμοί φορτωτή κλάσης είναι συνήθως ένα μαύρο κουτί.

Η μηχανή εκτέλεσης στο JVM

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

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

Πώς η μηχανή εκτέλεσης διαχειρίζεται τους πόρους του συστήματος

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

Θυμηθείτε ότι η JVM είναι υπεύθυνη για την απόρριψη της αχρησιμοποίητης μνήμης και ότι η συλλογή απορριμμάτων είναι ο μηχανισμός που κάνει αυτή τη διάθεση. Το JVM είναι επίσης υπεύθυνο για την κατανομή και τη συντήρηση του δομή αναφοράς που ο προγραμματιστής θεωρεί δεδομένο. Για παράδειγμα, η μηχανή εκτέλεσης του JVM είναι υπεύθυνη για τη λήψη κάτι σαν το νέος λέξη-κλειδί στην Java και μετατρέποντάς την σε μια συγκεκριμένη λειτουργική αίτηση για εκχώρηση μνήμης.

Πέρα από τη μνήμη, η μηχανή εκτέλεσης διαχειρίζεται πόρους για πρόσβαση στο σύστημα αρχείων και I / O δικτύου. Δεδομένου ότι το JVM είναι διαλειτουργικό σε λειτουργικά συστήματα, αυτό δεν είναι καθόλου καθήκον. Εκτός από τις ανάγκες πόρων κάθε εφαρμογής, η μηχανή εκτέλεσης πρέπει να ανταποκρίνεται σε κάθε περιβάλλον λειτουργικού συστήματος. Αυτός είναι ο τρόπος με τον οποίο το JVM είναι σε θέση να χειριστεί τις απαιτήσεις της άγριας φύσης.

Εξέλιξη JVM: Παρελθόν, παρόν, μέλλον

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

Θα μπορούσαμε να πούμε ότι ο Τζέιμς Γκόσλινγκ και ο Μπρένταν Άιχ εφευρέθηκαν σύγχρονος προγραμματισμός, αλλά χιλιάδες άλλοι έχουν βελτιώσει και βασιστεί στις ιδέες τους τις επόμενες δεκαετίες. Ενώ η εικονική μηχανή Java ήταν αρχικά μόνο για Java, σήμερα έχει εξελιχθεί για να υποστηρίζει πολλές γλώσσες σεναρίου και προγραμματισμού, συμπεριλαμβανομένων των Scala, Groovy και Kotlin. Κοιτώντας μπροστά, είναι δύσκολο να δούμε ένα μέλλον όπου το JVM δεν είναι εξέχον μέρος του τοπίου ανάπτυξης.

Όλα για την JVM

  • Java αμφισβητίες: Συμπεριφορά νήματος στο JVM
  • Java Challengers: Μέθοδος υπερφόρτωσης στο JVM
  • Εσωτερική βελτιστοποίηση απόδοσης JVM
  • Βασικά στοιχεία Bytecode: Πώς χειρίζεται το JVM bytecode
  • Εξαιρέσεις Java: Πώς χειρίζεται το JVM εξαιρέσεις
  • Παρουσιάζοντας την αδύνατη, μέση εικονική μηχανή Java

Αυτή η ιστορία, "Τι είναι το JVM; Παρουσιάζοντας την εικονική μηχανή Java" δημοσιεύθηκε αρχικά από το JavaWorld.