Jeder, der sich ein wenig auskennt, sollte wissen, dass Java eine Sprache ist, die leicht zu erlernen, aber schwer zu beherrschen ist. Da sie über viel Wissen verfügt, ist es nicht möglich, alles über Nacht zu beherrschen ist der Betriebsmechanismus und der Betriebsprozess von Java-Programmen. Einige der Artikel sind möglicherweise etwas chaotisch. Ich werde weiterhin hochwertige Artikel aktualisieren um es mit Ihnen zu teilen. Wir werden immer an dem Ziel festhalten, anderen zu helfen. Apache PHP MySQL
Java verfügt über zwei Kernmechanismen: Java Virtual Machine und Garbage Collection-Mechanismus. Derzeit liegt der Schwerpunkt hier auf JVM, das Java-Programme ausführt.
(1) So führen Sie ein Java-Programm im Terminal aus (ich habe dies unter Mac ausgeführt, das Prinzip ist unter Windows das gleiche, fast das gleiche)
Machen Sie es Dies setzt voraus, dass JDK installiert wurde und es keine Probleme gibt.
Wenn Sie eine Java-Klasse ausführen möchten, sollten Sie zunächst eine Java-Klasse haben.
1 Erstellen Sie einen Ordner mit dem Namen Java und erstellen Sie darunter eine Datei mit der Endung .java Ordner (I Es wurde mit sublime bearbeitet, andere Editoren sind auch akzeptabel), hier ist HelloWorld als Beispiel
2. Kompilieren Sie die Datei mit dem Befehl
192:libexec huayu$ javac /Users/huayu/Desktop/java/HelloWord.java
Nach der Ausführung des Befehls finden Sie eine zusätzliche Datei mit der Endung .class im Java-Ordner
3. Führen Sie die kompilierte Klassendatei aus (beachten Sie, dass sie sich im Ordner „.class“ befinden muss). (Ort, an dem sich die Klassendatei befindet) Fahren Sie fort und führen Sie den Befehl aus, andernfalls wird ein Fehler „Klasse nicht gefunden“ gemeldet. Sie sehen die folgende Ausgabe im Terminal
192:java huayu$ java HelloWord HelloWord
bis hierhin, herzlichen Glückwunsch! Sie haben Ihr erstes Java-Programm kompiliert und im Terminal ausgeführt.
Eigentlich weiß der Herausgeber, dass die Buchstaben im obigen Beispiel falsch sind, und lassen Sie mich nicht gehen, hehe
(2 ) Das Funktionsprinzip von jvm
Der Zweck der obigen Beispiele besteht nicht darin, uns zu zeigen, wie man Java-Programme im Terminal ausführt, sondern allen mitzuteilen, welche Vorgänge im obigen Prozess ausgeführt werden.
Das Javac-Programm ist ein Java-Compiler. Es kompiliert die Datei HelloWorld.java in die Datei HelloWorld.class und sendet sie an die Java Virtual Machine. Die virtuelle Maschine führt den vom Compiler in die Klassendatei eingefügten Bytecode aus.
(1) Der prinzipielle Mechanismus des JVM-Ladens von Klassendateien
Das Laden von Klassen in JVM erfolgt durch den Klassenlader (ClassLoader) und seine Unterklassen Der in Java implementierte Klassenlader ist eine wichtige Komponente des Java-Laufzeitsystems, die für das Suchen und Laden von Klassen in Klassendateien zur Laufzeit verantwortlich ist.
Aufgrund der plattformübergreifenden Natur von Java ist das kompilierte Java-Quellprogramm kein ausführbares Programm, sondern eine oder mehrere Klassendateien. Wenn ein Java-Programm eine Klasse verwenden muss, stellt die JVM sicher, dass die Klasse geladen, verbunden (überprüft, vorbereitet und analysiert) und initialisiert wurde.
Das Laden einer Klasse bezieht sich auf das Lesen der Daten in der .class-Datei der Klasse in den Speicher. Normalerweise wird ein Byte-Array zum Einlesen in die .class-Datei und dann ein entsprechendes Klassenobjekt erstellt Die geladene Klasse wird generiert. Nachdem der Ladevorgang abgeschlossen ist, ist das Klassenobjekt noch nicht vollständig, sodass die Klasse noch nicht verfügbar ist. Wenn die Klasse geladen ist, tritt sie in die Verbindungsphase ein, die drei Schritte umfasst: Überprüfung, Vorbereitung (Zuweisen von Speicher für statische Variablen und Festlegen von Standardanfangswerten) und Parsen (Ersetzen symbolischer Referenzen durch direkte Referenzen). Schließlich initialisiert die JVM die Klasse, einschließlich: 1) Wenn die Klasse eine direkte übergeordnete Klasse hat und die Klasse nicht initialisiert wurde, initialisieren Sie zuerst die übergeordnete Klasse. 2) Wenn die Klasse Initialisierungsanweisungen enthält, führen Sie diese Initialisierungsanweisungen aus der Reihe nach.
Das Laden von Klassen wird durch Klassenlader vervollständigt, darunter: Root-Loader (BootStrap), Erweiterungslader (Extension), Systemlader (System) und benutzerdefinierter Klassenlader (Unterklasse von java.lang.ClassLoader). Ab Java 2 (JDK 1.2) übernimmt der Klassenladeprozess den Father Delegation Mechanism (PDM). PDM gewährleistet die Sicherheit der Java-Plattform besser. Bei diesem Mechanismus ist der mit der JVM gelieferte Bootstrap der Root-Loader, während andere Loader nur einen übergeordneten Klassenlader haben. Das Laden einer Klasse erfordert zunächst das Laden des übergeordneten Klassenladers. Erst wenn der übergeordnete Klassenlader nichts tun kann, lädt der untergeordnete Klassenlader die Klasse selbst. Die JVM bietet keinen Verweis auf Bootstrap für Java-Programme.
Das Folgende sind Anweisungen für mehrere Klassenlader:
Bootstrap: im Allgemeinen in lokalem Code implementiert, verantwortlich für das Laden der JVM-Basis-Kernklassenbibliothek (rt.jar);
Erweiterung: von Die Klassenbibliothek wird in das durch die Systemeigenschaft java.ext.dirs angegebene Verzeichnis geladen. Ihr übergeordneter Loader ist Bootstrap. Es ist der am weitesten verbreitete Klassenlader. Es zeichnet Klassen aus dem Verzeichnis auf, das durch die Umgebungsvariable classpath oder die Systemeigenschaft java.class.path angegeben wird, und ist der standardmäßige übergeordnete Loader benutzerdefinierter Loader.
(2) Wie erreicht Java „einmal kompilieren und überall ausführen“?
Eine virtuelle Maschine kann als eine CPU verstanden werden, die Bytecode als Maschinenanweisungen verwendet.
Es gibt verschiedene virtuelle Maschinen für verschiedene Laufplattformen.
Der Java Virtual Machine-Mechanismus schützt die Unterschiede in den zugrunde liegenden Betriebsplattformen und erreicht „Einmal kompilieren, überall ausführen“.
(3) Garbage Collection-Mechanismus (GC)
Was ist GC?
GC bedeutet Garbage Collection, Speicherverarbeitung Hier sind Programmierer anfällig für Probleme. Vergessenes oder falsches Speicherrecycling kann zur Instabilität oder sogar zum Absturz des Programms oder Systems führen. Die von Java bereitgestellte GC-Funktion kann automatisch überwachen, ob das Objekt den Bereich überschreitet, um den Zweck des automatischen Speicherrecyclings zu erreichen. Die Java-Sprache bietet keine explizite Operationsmethode zum Freigeben des zugewiesenen Speichers. Java-Programmierer müssen sich nicht um die Speicherverwaltung kümmern, da der Garbage Collector sich automatisch darum kümmert. Um die Garbage Collection anzufordern, können Sie eine der folgenden Methoden aufrufen: System.gc() oder Runtime.getRuntime().gc(), aber die JVM kann explizite Garbage Collection-Aufrufe maskieren. Durch die Speicherbereinigung können Speicherlecks wirksam verhindert und der verfügbare Speicher effektiv genutzt werden. Der Garbage Collector wird normalerweise als separater Thread mit niedriger Priorität ausgeführt, um Objekte im Speicherheap zu löschen und zu recyceln, die unter unvorhersehbaren Umständen für längere Zeit nicht verwendet wurden. Programmierer können den Garbage Collector nicht in Echtzeit aufrufen oder alle Objekte werden einer Speicherbereinigung unterzogen (Programmierer können die Erfassungszeit nicht genau steuern). Der Aufruf von System.gc() oder Runtime.getRuntime().gc() ist gleichbedeutend mit der Benachrichtigung des GC, es zu sammeln. Es ist nur für einen Moment, es ist nicht sicher wann du es abholst.)
In den frühen Tagen von Java war die Garbage Collection eines der größten Highlights von Java, da serverseitige Programmierung erforderlich war, um Speicherlecks wirksam zu verhindern. Mit der Zeit hat sich der Garbage Collection-Mechanismus von Java jedoch zu etwas entwickelt das wurde kritisiert. Benutzer mobiler Smart-Terminals haben normalerweise das Gefühl, dass das iOS-System eine bessere Benutzererfahrung bietet als das Android-System. Einer der tiefgreifenden Gründe liegt in der Unvorhersehbarkeit der Speicherbereinigung im Android-System.
Ergänzung: Es gibt viele Garbage-Collection-Mechanismen, darunter: Garbage Collection für Generationskopien, markierte Garbage Collection, inkrementelle Garbage Collection usw. Ein Standard-Java-Prozess verfügt sowohl über einen Stack als auch über einen Heap. Der Stapel speichert primitive lokale Variablen und der Heap speichert die zu erstellenden Objekte. Der grundlegende Algorithmus der Java-Plattform zur Rückgewinnung und Wiederverwendung von Heap-Speicher heißt Mark and Sweep, aber Java hat ihn durch die Verwendung von „Generational Garbage Collection“ verbessert. Diese Methode unterteilt den Heap-Speicher entsprechend dem Lebenszyklus des Java-Objekts in verschiedene Bereiche. Während des Garbage-Collection-Prozesses kann das Objekt in verschiedene Bereiche verschoben werden:
- Eden: Dies ist der anfängliche Speicherort des Objekt Der Bereich, in dem sie geboren wurden, und für die meisten Objekte ist dies der einzige Bereich, in dem sie
jemals existiert haben.
- Überlebender: Objekte, die den Garten Eden überlebt haben, werden hierher verschoben.
- Tenured: Dies ist die Heimat erhaltener Objekte, die alt genug sind. Der Prozess der Sammlung junger Generationen (Minor-GC) wird diesen Ort nicht berühren. Wenn die Sammlung der jungen Generation das Objekt nicht in den lebenslangen Pflegegarten stellen kann, wird eine vollständige Sammlung (Major-GC) ausgelöst, die möglicherweise auch eine Komprimierung erfordert, um genügend Platz für große Objekte zu schaffen.
JVM-Parameter im Zusammenhang mit der Garbage Collection:
-Xms / -Xmx – Anfangsgröße des Heaps/Maximale Größe des Heaps
Ich habe viele Informationen überprüft, und einige Leute sagen, es sei eine interpretierte Sprache, und andere sagen, es sei eine kompilierte Sprache um Java mit der JS-Sprache zu vergleichen.
Werfen wir zunächst einen Blick auf die Einführung dieser beiden Sprachtypen:
Es gibt zwei Haupttypen von Computer-Hochsprachen: kompiliert und interpretiert:Interpretierte Sprache: Das Programm wird zur Laufzeit in Maschinensprache übersetzt, sodass die Ausführungsgeschwindigkeit langsamer ist als bei kompilierter Sprache.
Der größte Unterschied zwischen den beiden besteht darin, ob der Zielmaschinencode gespeichert wird: Durch die Kompilierung wird das Eingabequellprogramm in einen Zielmaschinencode in einer bestimmten Einheit (z. B. Basisblock/Funktion/Methode/Trace usw.) übersetzt Speichern Sie es (unabhängig davon, ob es sich auf der Festplatte oder im Speicher befindet). Bei der anschließenden Ausführung werden die Anweisungen im Quellprogramm einzeln interpretiert und ausgeführt. Der Zielcode wird dort nicht gespeichert Es handelt sich nicht um Informationen, die bei späteren Ausführungen wiederverwendet werden können.
Verstehen Sie den laufenden Prozess von Java: Die Java-Quelldatei (*.java) wird vom Java-Compiler (javac) kompiliert, um eine ByteCode-Bytecode-Datei (*.class) zu generieren Der Computer (d. h. die Java Virtual Machine, JVM) interpretiert und führt jeden auszuführenden Bytecode an den Interpreter aus und führt ihn dann auf der bestimmten Maschine aus.
Obwohl der erste Schritt von Java die Javac-Kompilierung ist und die Zieldatei ByteCode und keine Maschinensprache ist, kann es drei nachfolgende Verarbeitungsmethoden geben (hier, derzeit für Diese drei). Verarbeitungsmethoden werden nicht bewertet und müssen nach eingehender Diskussion der JVM-Kenntnisse überprüft werden):
1. Während der Laufzeit wird ByteCode einzeln von der JVM an den Interpreter gesendet, und der Interpreter übersetzt ihn in Maschinencode umwandeln und ausführen. (Viele Leute sagen, dass dies der Ausgangspunkt für interpretierte Sprachen ist)
2. Während der Laufzeit kann ein Teil des ByteCodes vom Just-In-Time-Compiler (JIT) in Zielmaschinencode kompiliert und dann ausgeführt werden (Mit Methode as Die Übersetzungseinheit wird gespeichert und muss für die zweite Ausführung nicht in Maschinencode übersetzt werden), da einige JVMs mit reiner JIT-Kompilierung implementiert werden und keinen Interpreter enthalten, wie zum Beispiel: JRockit, Maxine VM.
3. RTSJ führt nach Javac eine sekundäre AOT-Kompilierung durch, um statischen Zielplattformcode zu generieren.
Manchmal können die oben genannten drei Methoden gleichzeitig verwendet werden. Mindestens 1 und 2 werden gleichzeitig verwendet und 3 muss vom Programmierer manuell angegeben werden.
In dieser Hinsicht bin ich eher bereit zu akzeptieren, dass Java eine Hybridsprache zwischen Kompilierung und Interpretation ist.
Ende:
Dies ist das Ende dieses Artikels. Wenn es irgendwelche Mängel gibt, sind Sie herzlich willkommen Weisen Sie darauf hin und kommunizieren Sie!
Verwandte Artikel:
Analyse des Programmbetriebsmechanismus und der Fehler in Java
Eingehende Interpretation des PHP-Betriebsmechanismus
Ähnliche Videos:
Methodenaufrufdefinition und Aufruf der Void-Typ-Methode – JAVA-Anfänger-Video-Tutorial
Das obige ist der detaillierte Inhalt vonWie führe ich ein Java-Programm im Terminal aus? Analysieren Sie den Funktionsmechanismus und die Funktionsprinzipien. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!