Was ist die JVM? Einführung in die Java Virtual Machine

Die Java Virtual Machine ist ein Programm, mit dem andere Programme ausgeführt werden sollen. Es ist eine einfache Idee, die auch als eines unserer besten Beispiele für die Codierung von Kung Fu gilt . Die JVM hat den Status Quo für ihre Zeit gestört und unterstützt auch heute noch Programminnovationen.

Wofür die JVM verwendet wird

Die JVM hat zwei Hauptfunktionen: Java-Programme können auf jedem Gerät oder Betriebssystem ausgeführt werden (bekannt als "Einmal schreiben, überall ausführen" -Prinzip) und Programmspeicher verwalten und optimieren. Als Java 1995 veröffentlicht wurde, wurden alle Computerprogramme auf ein bestimmtes Betriebssystem geschrieben, und der Programmspeicher wurde vom Softwareentwickler verwaltet. Die JVM war also eine Offenbarung.

JavaWorld /

Eine technische Definition für die JVM ist nützlich, und es gibt auch eine alltägliche Art und Weise, wie Softwareentwickler darüber nachdenken. Lassen Sie uns diese aufschlüsseln:

  • Technische Definition : Die JVM ist die Spezifikation für ein Softwareprogramm, das Code ausführt und die Laufzeitumgebung für diesen Code bereitstellt.
  • Alltagsdefinition : Mit der JVM führen wir unsere Java-Programme aus. Wir konfigurieren die Einstellungen der JVM und verlassen uns dann darauf, um die Programmressourcen während der Ausführung zu verwalten.

Wenn Entwickler über die JVM sprechen, meinen wir normalerweise den Prozess, der auf einem Computer ausgeführt wird, insbesondere auf einem Server, der die Ressourcennutzung für eine Java-App darstellt und steuert. Vergleichen Sie dies mit der JVM-Spezifikation , in der die Anforderungen für die Erstellung eines Programms beschrieben sind, das diese Aufgaben ausführt.

Wer entwickelt und pflegt die JVM?

Die JVM ist weit verbreitet, wird häufig verwendet und von einigen sehr intelligenten Programmierern, sowohl Unternehmen als auch Open Source, gewartet. Das OpenJDK-Projekt ist das Ergebnis der Entscheidung von Sun Microsystems, Open Source Java zu verwenden. OpenJDK hat die Verwaltung von Java durch Oracle fortgesetzt, wobei Oracle-Ingenieure heutzutage einen Großteil der Anstrengungen unternommen haben.

Speicherverwaltung in der JVM

Die häufigste Interaktion mit einer laufenden JVM besteht darin, die Speichernutzung im Heap und Stack zu überprüfen. Die häufigste Einstellung ist das Anpassen der Speichereinstellungen der JVM.

Müllabfuhr

Vor Java wurde der gesamte Programmspeicher vom Programmierer verwaltet. In Java wird der Programmspeicher von der JVM verwaltet. Die JVM verwaltet den Speicher über einen Prozess namens Garbage Collection , der nicht verwendeten Speicher in Java-Programmen kontinuierlich identifiziert und beseitigt. Die Speicherbereinigung erfolgt in einer laufenden JVM.

In den frühen Tagen wurde Java vielfach kritisiert, weil es nicht so "nah am Metall" wie C ++ und daher nicht so schnell war. Der Müllabfuhrprozess war besonders umstritten. Seitdem wurden verschiedene Algorithmen und Ansätze vorgeschlagen und für die Speicherbereinigung verwendet. Durch konsequente Entwicklung und Optimierung hat sich die Speicherbereinigung erheblich verbessert.

Was bedeutet "nah am Metall"?

Wenn Programmierer sagen, dass eine Programmiersprache oder -plattform "nah am Metall" ist, bedeutet dies, dass der Entwickler den Speicher eines Betriebssystems programmgesteuert (durch Schreiben von Code) verwalten kann. Theoretisch können Programmierer mehr Leistung aus unseren Programmen herausholen, indem sie festlegen, wie viel verwendet wird und wann sie verworfen werden sollen. In den meisten Fällen führt die Delegierung der Speicherverwaltung an einen hochentwickelten Prozess wie die JVM zu einer besseren Leistung und weniger Fehlern als die Selbstverwaltung.

Die JVM besteht aus drei Teilen

Man könnte sagen, dass die JVM drei Aspekte hat: Spezifikation, Implementierung und Instanz. Betrachten wir jedes davon.

1. Die JVM-Spezifikation

Erstens ist die JVM eine Softwarespezifikation. In einer etwas kreisförmigen Weise hebt die JVM-Spezifikation hervor, dass ihre Implementierungsdetails nicht innerhalb der Spezifikation definiert sind , um maximale Kreativität bei ihrer Realisierung zu ermöglichen:

"Um die Java Virtual Machine korrekt zu implementieren, müssen Sie nur das classDateiformat lesen und die darin angegebenen Vorgänge korrekt ausführen können."

JS Bach hat einmal beschrieben, wie man Musik ähnlich macht:

"Alles was Sie tun müssen, ist die richtige Taste zur richtigen Zeit zu berühren."

Alles, was die JVM tun muss, ist, Java-Programme korrekt auszuführen. Klingt einfach, mag von außen vielleicht einfach aussehen, ist aber ein gewaltiges Unterfangen, insbesondere angesichts der Leistungsfähigkeit und Flexibilität der Java-Sprache.

Die JVM als virtuelle Maschine

Die JVM ist eine virtuelle Maschine , die Java-Klassendateien auf tragbare Weise ausführt. Als virtuelle Maschine bedeutet die JVM eine Abstraktion einer zugrunde liegenden, tatsächlichen Maschine - beispielsweise des Servers, auf dem Ihr Programm ausgeführt wird. Unabhängig davon, welches Betriebssystem oder welche Hardware tatsächlich vorhanden ist, erstellt die JVM eine vorhersehbare Umgebung, in der Programme ausgeführt werden können. Im Gegensatz zu einer echten virtuellen Maschine erstellt die JVM jedoch kein virtuelles Betriebssystem. Es wäre genauer, die JVM als verwaltete Laufzeitumgebung oder als virtuelle Prozessmaschine zu beschreiben .

2. JVM-Implementierungen

Die Implementierung der JVM-Spezifikation führt zu einem tatsächlichen Softwareprogramm, bei dem es sich um eine JVM-Implementierung handelt. Tatsächlich gibt es viele JVM-Implementierungen, sowohl Open Source als auch proprietär. Die HotSpot JVM von OpenJDK ist die Referenzimplementierung und bleibt eine der am gründlichsten erprobten Codebasen der Welt. HotSpot ist auch die am häufigsten verwendete JVM.

Fast alle lizenzierten JVMs werden als Gabeln aus dem OpenJDK und der HotSpot-JVM erstellt, einschließlich des lizenzierten JDK von Oracle. Entwickler, die eine lizenzierte Verzweigung aus dem OpenJDK erstellen, sind häufig von dem Wunsch motiviert, betriebssystemspezifische Leistungsverbesserungen hinzuzufügen. In der Regel laden Sie die JVM als gebündelten Teil einer Java Runtime Environment (JRE) herunter und installieren sie.

3. Eine JVM-Instanz

Nachdem die JVM-Spezifikation implementiert und als Softwareprodukt veröffentlicht wurde, können Sie sie herunterladen und als Programm ausführen. Dieses heruntergeladene Programm ist eine Instanz (oder instanziierte Version) der JVM.

Wenn Entwickler von "der JVM" sprechen, beziehen wir uns meistens auf eine JVM-Instanz, die in einer Softwareentwicklungs- oder Produktionsumgebung ausgeführt wird. Sie könnten sagen: "Hey Anand, wie viel Speicher verwendet die JVM auf diesem Server?" oder: "Ich kann nicht glauben, dass ich einen zirkulären Aufruf erstellt habe und ein Stapelüberlauffehler meine JVM zum Absturz gebracht hat. Was für ein Anfängerfehler!"

Was ist eine Softwarespezifikation?

Eine Softwarespezifikation (oder -spezifikation) ist ein lesbares Konstruktionsdokument, das beschreibt, wie ein Softwaresystem funktionieren sollte. Der Zweck einer Spezifikation besteht darin, eine klare Beschreibung und Anforderungen zu erstellen, nach denen Ingenieure codieren können.

Laden und Ausführen von Klassendateien in der JVM

Wir haben über die Rolle der JVM beim Ausführen von Java-Anwendungen gesprochen, aber wie führt sie ihre Funktion aus? Um Java-Anwendungen ausführen zu können, ist die JVM vom Java-Klassenladeprogramm und einer Java-Ausführungs-Engine abhängig.

Der Java-Klassenlader in der JVM

Alles in Java ist eine Klasse, und alle Java-Anwendungen werden aus Klassen erstellt. Eine Anwendung kann aus einer Klasse oder Tausenden bestehen. Um eine Java-Anwendung ausführen zu können, muss eine JVM kompilierte .class-Dateien in einen Kontext wie einen Server laden, auf den zugegriffen werden kann. Eine JVM hängt von ihrem Klassenladeprogramm ab, um diese Funktion auszuführen.

Der Java-Klassenladeprogramm ist der Teil der JVM, der Klassen in den Speicher lädt und zur Ausführung bereitstellt. Klassenlader verwenden Techniken wie Lazy-Loading und Caching, um das Laden von Klassen so effizient wie möglich zu gestalten. Das Laden von Klassen ist jedoch nicht der epische Rätsel, den (sagen wir) tragbare Laufzeitspeicherverwaltung darstellt, daher sind die Techniken vergleichsweise einfach.

Jede Java Virtual Machine enthält einen Klassenlader. Die JVM-Spezifikation beschreibt Standardmethoden zum Abfragen und Bearbeiten des Klassenladeprogramms zur Laufzeit. JVM-Implementierungen sind jedoch für die Erfüllung dieser Funktionen verantwortlich. Aus Sicht des Entwicklers sind die zugrunde liegenden Mechanismen zum Laden von Klassen normalerweise eine Black Box.

Die Ausführungs-Engine in der JVM

Sobald der Klassenlader das Laden von Klassen abgeschlossen hat, beginnt die JVM mit der Ausführung des Codes in jeder Klasse. Die Ausführungsengine ist die JVM-Komponente, die diese Funktion übernimmt. Die Ausführungs-Engine ist für die laufende JVM von wesentlicher Bedeutung. Tatsächlich ist es für alle praktischen Zwecke die JVM-Instanz.

Das Ausführen von Code umfasst das Verwalten des Zugriffs auf Systemressourcen. Die JVM-Ausführungs-Engine steht zwischen dem laufenden Programm - mit seinen Anforderungen an Datei-, Netzwerk- und Speicherressourcen - und dem Betriebssystem, das diese Ressourcen bereitstellt.

Wie die Ausführungs-Engine Systemressourcen verwaltet

Systemressourcen können in zwei große Kategorien unterteilt werden: Speicher und alles andere.

Denken Sie daran, dass die JVM für die Entsorgung nicht verwendeten Speichers verantwortlich ist und dass die Speicherbereinigung der Mechanismus ist, der diese Entsorgung durchführt. Die JVM ist auch für die Zuweisung und Pflege der Referenzstruktur verantwortlich, die der Entwickler für selbstverständlich hält. Beispielsweise ist die Ausführungs-Engine der JVM dafür verantwortlich, das newSchlüsselwort in Java in eine betriebssystemspezifische Anforderung für die Speicherzuweisung umzuwandeln.

Über den Arbeitsspeicher hinaus verwaltet die Ausführungsengine Ressourcen für den Dateisystemzugriff und die Netzwerk-E / A. Da die JVM betriebssystemübergreifend interoperabel ist, ist dies keine leichte Aufgabe. Zusätzlich zu den Ressourcenanforderungen jeder Anwendung muss die Ausführungsengine auf jede Betriebssystemumgebung reagieren. Auf diese Weise kann die JVM Anforderungen in freier Wildbahn bewältigen.

JVM-Evolution: Vergangenheit, Gegenwart, Zukunft

1995 führte die JVM zwei revolutionäre Konzepte ein, die seitdem zum Standard für die moderne Softwareentwicklung geworden sind: "Einmal schreiben, überall ausführen" und automatische Speicherverwaltung. Software-Interoperabilität war zu dieser Zeit ein kühnes Konzept, aber nur wenige Entwickler würden heute zweimal darüber nachdenken. Während unsere technischen Vorfahren den Programmspeicher selbst verwalten mussten, wuchs meine Generation mit der Speicherbereinigung auf.

Wir könnten sagen, dass James Gosling und Brendan Eich die moderne Programmierung erfunden haben, aber Tausende von anderen haben ihre Ideen in den folgenden Jahrzehnten verfeinert und weiterentwickelt. Während die Java Virtual Machine ursprünglich nur für Java gedacht war, unterstützt sie heute viele Skript- und Programmiersprachen, darunter Scala, Groovy und Kotlin. Mit Blick auf die Zukunft ist eine Zukunft schwer zu erkennen, in der die JVM kein wichtiger Bestandteil der Entwicklungslandschaft ist.

Alles über die JVM

  • Java-Herausforderer: Thread-Verhalten in der JVM
  • Java-Herausforderer: Methodenüberladung in der JVM
  • Innerhalb der JVM-Leistungsoptimierung
  • Grundlagen des Bytecodes: Wie die JVM mit Bytecode umgeht
  • Java-Ausnahmen: Wie die JVM mit Ausnahmen umgeht
  • Einführung der schlanken, gemeinen Java Virtual Machine

Diese Geschichte "Was ist die JVM? Einführung in die Java Virtual Machine" wurde ursprünglich von JavaWorld veröffentlicht.