In diesem Artikel werden hauptsächlich die relevanten Inhalte der Java Virtual Machine (JVM) sowie der Laufmechanismus und die Fehleranalyse von Java-Programmen vorgestellt. Freunde, die es benötigen, können mehr erfahren.
JVM (Java Virtual Machine ) Eine Spezifikation für Computergeräte, die auf unterschiedliche Weise (Software oder Hardware) implementiert werden können. Das Kompilieren des Befehlssatzes für eine virtuelle Maschine ähnelt stark dem Kompilieren des Befehlssatzes für einen Mikroprozessor. Die Java Virtual Machine umfasst eine Reihe von Bytecode-Anweisungen, eine Reihe von Registern, einen Stapel, einen Garbage-Collection-Heap und ein Speichermethodenfeld.
Die Java Virtual Machine (JVM) ist ein imaginärer Computer, der Java-Code ausführen kann. Solange der Interpreter gemäß der JVM-Spezifikation auf einen bestimmten Computer portiert wird, kann garantiert werden, dass jeder kompilierte Java-Code auf diesem System ausgeführt wird.
1. Warum Java Virtual Machine verwenden?
Ein sehr wichtiges Merkmal der Java-Sprache ist ihre Unabhängigkeit von der Plattform. Die Verwendung einer Java Virtual Machine ist der Schlüssel zum Erreichen dieser Funktion. Will eine allgemeine Hochsprache auf verschiedenen Plattformen laufen, muss sie zumindest in unterschiedliche Zielcodes kompiliert werden. Nach der Einführung der virtuellen Maschine der Java-Sprache muss die Java-Sprache nicht neu kompiliert werden, wenn sie auf verschiedenen Plattformen ausgeführt wird. Java-Sprachnutzungsmodell Die Java Virtual Machine schirmt Informationen zu bestimmten Plattformen ab, sodass der Java-Sprachcompiler nur den Zielcode (Bytecode) generieren muss, der auf der Java Virtual Machine ausgeführt wird, und ohne Änderung auf mehreren Plattformen ausgeführt werden kann. Wenn die Java Virtual Machine Bytecode ausführt, interpretiert sie den Bytecode in Maschinenanweisungen zur Ausführung auf der spezifischen Plattform.
Java-Ausführungsmechanismus
Die Ausführung eines Java-Programms muss drei Schritte durchlaufen: Schreiben, Kompilieren und Ausführen.
Schreiben bezieht sich auf die Eingabe von Programmcode in die Java-Entwicklungsumgebung, um letztendlich eine Java-Quelldatei mit der Endung .java zu erstellen.
Kompilierung bezieht sich auf den Prozess der Verwendung des Java-Compilers zur Fehlersuche in Quelldateien. Nach der Kompilierung wird eine Bytecode-Datei mit dem Suffix .class generiert. Dies ist nicht mit der C-Sprache vergleichbar, die letztendlich eine generiert ausführbares Dokument.
Ausführen bezieht sich auf die Verwendung eines Java-Interpreters, um eine Bytecode-Datei in Maschinencode zu übersetzen, auszuführen und die Ergebnisse anzuzeigen
Eine Bytecode-Datei ist eine Art Maschinencode, der ist mit jeder bestimmten Maschine kompatibel. Der Zwischencode ist unabhängig von der Umgebung und der Betriebssystemumgebung. Es handelt sich um eine Binärdatei und eine Objektcodedatei, die nach der Kompilierung der Java-Quelldatei durch den Java-Compiler generiert wird. Weder Programmierer noch Computer können Bytecode-Dateien direkt lesen. Sie müssen von einem dedizierten Java-Interpreter interpretiert und ausgeführt werden. Daher ist Java eine Sprache, die auf der Grundlage der Kompilierung interpretiert und ausgeführt wird.
Der Java-Interpreter ist für die Übersetzung von Bytecode-Dateien in Maschinencode unter bestimmten Hardwareumgebungen und Betriebssystemplattformen zur Ausführung verantwortlich. Daher können Java-Programme nicht direkt auf vorhandenen Betriebssystemplattformen ausgeführt werden. Sie müssen auf einer Softwareplattform namens Java Virtual Machine ausgeführt werden.
Java Virtual Machine (JVM) ist eine Softwareumgebung zum Ausführen von Java-Programmen. Der Java-Interpreter ist Teil der Java Virtual Machine. Beim Ausführen eines Java-Programms wird zuerst die JVM gestartet und ist dann für die Interpretation und Ausführung des Java-Bytecodes verantwortlich. Java-Bytecode kann nur auf der JVM ausgeführt werden. Auf diese Weise kann die JVM verwendet werden, um das Java-Bytecode-Programm von der spezifischen Hardwareplattform und Betriebssystemumgebung zu trennen. Solange die JVM für eine bestimmte Plattform auf verschiedenen Computern installiert ist, kann das Java-Programm ohne Berücksichtigung der aktuellen Besonderheiten ausgeführt werden Hardwareplattform und Betriebssystemumgebung müssen nicht die Plattform berücksichtigen, auf der die Bytecodedatei generiert wurde. Die JVM verbirgt die spezifischen Unterschiede zwischen verschiedenen Software- und Hardwareplattformen und erreicht so eine echte plattformübergreifende Transplantation auf Binärcodeebene. JVM ist die plattformunabhängige Grundlage von Java. Die plattformübergreifenden Funktionen von Java werden durch die Ausführung von Java-Programmen in JVM realisiert.
Der „Einmal schreiben, überall ausführen“-Ansatz der Java-Sprache löst effektiv die Notwendigkeit, dass die meisten höheren Programmiersprachen auf unterschiedliche Ziele abzielen. Das System kompiliert und generiert verschiedene Maschinencodes. Das heißt, das heterogene Problem der Hardwareumgebung und der Betriebsplattform, wodurch der Aufwand für Programmentwicklung, Wartung und Verwaltung erheblich reduziert wird.
Es ist zu beachten, dass Java-Programme über JVM plattformübergreifende Funktionen erreichen können, JVM jedoch nicht plattformübergreifend ist. Mit anderen Worten: JVMs auf verschiedenen Betriebssystemen sind unterschiedlich. JVMs auf Windows-Plattformen können nicht unter Linux verwendet werden und umgekehrt.
JAVA-Programmbetriebsfehleranalyse
Im Allgemeinen kann ein in Betrieb genommenes Großprojekt in den folgenden Situationen Probleme haben:
1. Abnormale CPU-Auslastung
1) Überprüfen Sie die CPU-Auslastung, die Auslastung des Zielprozesses und dann die Auslastung jedes Kerns. Es kann dabei helfen, herauszufinden, ob es sich um ein einzelnes Thread-Problem oder ein Thread-Pool-Problem handelt.
2) Manchmal steigt die CPU plötzlich vertikal an, nachdem das Programm eine Zeit lang normal ausgeführt wurde, was möglicherweise mit der Sperre im Programm zusammenhängt (wenn die Sperre eine Zeit lang gehalten wird). Für kurze Zeit ist es besser, es zu versuchen cas+yield Um Spin Lock zu implementieren)
3) Deadlock, exportieren Sie den Aufrufstapel direkt, um eine Lösung für das Problem zu finden.
2. Abnormaler Speicher
1) Speicherverlust, nichts zu sagen, werfen Sie den Stapel ab, um das Problem zu finden
2) Häufiges GC führt auch zu einer unzureichenden Leistung. Wenn GC häufig im Programm auftritt, sollten Sie darauf achten. Wenn die Größe der neuen Generation das Problem immer noch nicht löst, müssen Sie eine große Anzahl von GCs finden Codes, die temporäre Objekte erstellen (Sie können die Objektpool-Technologie verwenden, um eine wiederholte Verwendung von Speicher zu vermeiden)
3. Unerwartete Beendigung eines Arbeitsthreads
4. Abnormale E/A
1) Offene Dateien, E/A-Vorgangsnutzung und Festplattennutzung anzeigen. Sie können den Befehl df iostat usw. verwenden.
2) Um zu überprüfen, ob Programme die Überwachung und Netzwerknutzung belegen, können Sie den Befehl netstat usw. verwenden.
Tools zum Analysieren von Fehlern verwenden
1.jmap
jmap pid Standardmäßig werden Informationen zur Speichernutzung im JAVA-Prozess angezeigt
jmap -histo pid Speicher anzeigen Anzahl der aktiven Instanzen
jmap -dump:format=b,file=(Dateiname) pid Exportiert den Java-Programmspeicher vollständig. Die vollständige Analyse ist in drei Prozesse unterteilt: Führen Sie jmap -dump:format=b,file=a.bin einmal nach der Initialisierung des Programms aus, führen Sie es dann einmal aus, wenn die Speichernutzung zunimmt, und führen Sie es schließlich erneut aus, nachdem es erreicht ist Obergrenze. Verwenden Sie JHat oder ein Drittanbieter-Tool, um die Dump-Datei zu öffnen.
3.jstack oder JCONSOLE
Standardmäßig können Sie Informationen zum Prozessaufrufstapel anzeigen, um E/A-Zeitüberschreitungen, Deadlocks oder andere Situationen zu analysieren. Informationen, die analysiert werden müssen, wenn in einem Programm eine Anomalie auftritt, können bei der Lokalisierung und Fehlerbehebung von Problemen hilfreich sein.
jstat -gc pid gaptime GC-bezogene Informationen anzeigen
jstat -compiler pid Kompilierungsinformationen in Echtzeit anzeigen
4.kill - 3
Wie oben, geeignet für Server, auf denen das Entwicklungstool nicht installiert ist. Es kann Aufrufstapelinformationen und einen Teil der GC-Informationen ausgeben
5.iftop-Ansicht Netzwerkport
Eingehenden und ausgehenden Netzwerkverkehr anzeigen Der Datenverkehr zwischen dem Zielserver und dem Zielserver kann bei der Fehlerbehebung helfen, ob er durch einen Angriff verursacht wurde
pstack virtueller Maschinenstapel
erfordert die Installation von gdb, das im Allgemeinen zum Überprüfen von C/C++-Programmen verwendet wird, wenn bestimmte Fehler auf virtueller Maschinenebene auftreten.
Zusammenfassung
Das obige ist der detaillierte Inhalt vonAnalyse der Programmausführungsmechanismen und Fehler in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!