Java virtuelle Maschine

Ein Java Virtuelle Maschine (JVM) ist eine virtuelle Maschine, die Java bytecode durchführen kann. Es ist der Codeausführungsbestandteil der javanischen Softwareplattform. Sonne-Mikrosysteme haben festgestellt, dass es mehr als 5.5 Milliarden JVM-ermöglichte Geräte gibt.

Übersicht

Javas virtuelle Maschine ist Software, die auf der virtuellen und nichtvirtuellen Hardware und auf Standardbetriebssystemen durchgeführt wird. Ein JVM stellt eine Umgebung zur Verfügung, in der Java bytecode durchgeführt werden kann, solche Eigenschaften wie das automatisierte Ausnahme-Berühren ermöglichend, das Wurzelursache-Beseitigen-Auskunft für jeden Softwarefehler (Ausnahme) gibt, die des Quellcodes unabhängig ist. Ein JVM wird zusammen mit einer Reihe von Standardklassenbibliotheken verteilt, die die javanische Anwendung, Schnittstelle programmierend (API) durchführen. Verwenden Sie zusammengeschlossenen im Bündel von APIs mit der JVM-Form Java Runtime Environment (JRE).

JVMs sind für viele Hardware und Softwareplattformen verfügbar. Der Gebrauch desselben bytecode für den ganzen JVMs auf allen Plattformen erlaubt Java, als ein Schreiben einmal beschrieben, überall geführt zu werden, Programmiersprache, dagegen schreiben einmal, kompilieren überall, der kompilierte Sprachen der Quer-Plattform beschreibt. So ist der JVM ein entscheidender Bestandteil der javanischen Plattform.

Java bytecode ist eine Zwischensprache, die normalerweise von Java kompiliert wird, aber es kann auch aus anderen Programmiersprachen kompiliert werden. Zum Beispiel kann Quellcode von Ada nach Java bytecode kompiliert und auf einem JVM durchgeführt werden.

Orakel, der Eigentümer Javas, erzeugt einen JVM, aber JVMs das Verwenden der javanischen Handelsmarke kann von anderen Gesellschaften entwickelt werden, so lange sie an der JVM Spezifizierung kleben, die durch das Orakel und zu zusammenhängenden vertraglichen Verpflichtungen veröffentlicht ist.

Das Orakel JVM, genannt HotSpot, wird im C ++ Sprache geschrieben.

Ausführungsumgebung

Die javanische Ausführungsumgebung des Orakels wird die javanische Laufzeitumgebung oder JRE genannt.

Programme, die beabsichtigt sind, um auf einem JVM zu laufen, müssen in ein standardisiertes tragbares binäres Format kompiliert werden, das normalerweise in der Form von.class Dateien kommt. Ein Programm kann aus vielen Klassen in verschiedenen Dateien bestehen. Für den leichteren Vertrieb von großen Programmen können vielfache Klassendateien zusammen in einer.jar Datei (kurz für das javanische Archiv) paketiert werden.

Die javanische Anwendungsabschussvorrichtung bietet eine Standardweise an, javanischen Code durchzuführen. Sich vergleichen.

Die JVM Durchlaufzeit führt durch oder Dateien, mit dem JVM Befehlssatz durch die Interpretation davon oder das Verwenden gerade rechtzeitig Bearbeiter (JIT) wie HotSpot des Orakels wetteifernd. Das JIT Kompilieren, nicht Interpretation, wird im grössten Teil von JVMs heute verwendet, um größere Geschwindigkeit zu erreichen. Es gibt auch vorzeitig Bearbeiter, die Entwicklern ermöglichen, Klassendateien in den heimischen Code für besondere Plattformen zu vorkompilieren.

Wie die meisten virtuellen Maschinen Java hat virtuelle Maschine eine Stapel-basierte mit einem Mikrokontrolleur/Mikroprozessor verwandte Architektur. Jedoch hat der JVM auch auf niedriger Stufe Unterstützung für Java ähnliche Klassen und Methoden, der sich auf ein hoch idiosynkratisches Gedächtnis vorbildliche und Fähigkeitsbasierte Architektur beläuft.

JVM Sprachen

Obwohl der JVM in erster Linie das Laufen von kompilierten javanischen Programmen gezielt wurde, können viele andere Sprachen jetzt obendrein laufen.

Der JVM hat zurzeit keine eingebaute Unterstützung für dynamisch getippte Sprachen: Der vorhandene JVM Befehlssatz wird statisch getippt, obwohl der JVM verwendet werden kann, um Dolmetscher für dynamische Sprachen durchzuführen. Vor Java 7 hatte der JVM eine beschränkte Unterstützung, um vorhandene Klassen und Methoden dynamisch zu modifizieren; das hat nur in einer Beseitigen-Umgebung gearbeitet, wo neue Klassen und Methoden dynamisch hinzugefügt werden können.

Die bessere Unterstützung für dynamische Sprachen wird in JVM seit Java 7 eingeschlossen.

Bytecode verifier

Eine grundlegende Philosophie Javas ist, dass es vor der Einstellung von Natur aus sicher ist, dass kein Benutzerprogramm die Gastgeber-Maschine zertrümmern oder sich sonst unpassend mit anderen Operationen auf der Gastgeber-Maschine einmischen kann, und dass es möglich ist, bestimmte Methoden und Datenstrukturen zu schützen, die dem vertrauten Code vom Zugang oder der Bestechung durch die unvertraute Codedurchführung innerhalb desselben JVM gehören. Außerdem wird allgemeinen Programmierer-Fehlern, die häufig zu Datenbestechung oder unvorhersehbarem Verhalten wie das Zugreifen vom Ende einer Reihe oder des Verwendens eines uninitialisierten Zeigestocks führen, nicht erlaubt vorzukommen. Mehrere Eigenschaften Javas verbinden sich, um diese Sicherheit, einschließlich des Klassenmodells, des Müll-gesammelten Haufens und des verifier zur Verfügung zu stellen.

Der JVM prüft den ganzen bytecode nach, bevor es durchgeführt wird. Diese Überprüfung besteht in erster Linie aus drei Typen von Kontrollen:

  • Zweige sind immer zu gültigen Positionen
  • Daten werden immer initialisiert, und Verweisungen sind immer vor dem Typ sicherer
  • Der Zugang zum privaten oder Paket private Daten und Methoden wird starr kontrolliert.

Die ersten zwei dieser Kontrollen finden in erster Linie während des Überprüfungsschritts statt, der vorkommt, wenn eine Klasse geladen und berechtigt für den Gebrauch gemacht wird. Das dritte wird in erster Linie dynamisch durchgeführt, wenn auf Datensachen oder Methoden einer Klasse zuerst durch eine andere Klasse zugegriffen wird.

Der verifier erlaubt nur einige bytecode Folgen in gültigen Programmen, z.B ein Sprung (Zweig) Instruktion kann nur eine Instruktion innerhalb derselben Methode ins Visier nehmen. Außerdem stellt der verifier sicher, dass jede gegebene Instruktion auf einer festen Stapel-Position funktioniert, dem JIT Bearbeiter erlaubend, Stapel-Zugänge in feste Register-Zugänge umzugestalten. Wegen dessen dass der JVM eine Stapel-Architektur ist, bezieht keine Geschwindigkeitsstrafe für den Wetteifer auf Register-basierten Architekturen ein, wenn er einen JIT Bearbeiter verwendet. Angesichts der codenachgeprüften JVM Architektur macht es keinen Unterschied zu einem JIT Bearbeiter, ob es genannte imaginäre Register oder imaginäre Stapel-Positionen bekommt, die den Zielarchitektur-Registern zugeteilt werden müssen. Tatsächlich macht Codeüberprüfung das JVM verschiedene von einer klassischen Stapel-Architektur, welcher effizienter Wetteifer mit einem JIT Bearbeiter mehr kompliziert und normalerweise durch einen langsameren Dolmetscher ausgeführt ist.

Codeüberprüfung stellt auch sicher, dass sich willkürliche Bit-Muster als eine Adresse nicht gewöhnen können. Speicherschutz wird ohne das Bedürfnis nach einer Speicherverwaltungseinheit (MMU) erreicht. So ist JVM eine effiziente Weise, Speicherschutz auf einfachen Architekturen zu bekommen, die an einem MMU Mangel haben. Das ist dem geführten Code in der.NET Durchlaufzeit der Gemeinsamen Sprache des Microsofts analog, und Fähigkeitsarchitekturen wie Plessey 250, und IBM System/38 begrifflich ähnlich.

Die ursprüngliche Spezifizierung für den bytecode verifier hat natürliche Sprache verwendet, die unvollständig oder in etwas Hinsicht falsch war. Mehrere Versuche sind gemacht worden, den JVM als ein formelles System anzugeben. Auf diese Weise kann die Sicherheit von JVM aktuellen Durchführungen, und potenzielle verhinderte Sicherheitsgroßtaten mehr gründlich analysiert werden. Es wird auch möglich sein, den JVM durch das Auslassen unnötiger Sicherheitskontrollen zu optimieren, wenn, wie man beweist, die Anwendung, die wird führt, sicher ist.

Instruktionen von Bytecode

Der JVM hat Instruktionen für die folgenden Gruppen von Aufgaben:

  • Last und Laden
  • Arithmetik
  • Typ-Konvertierung
  • Gegenstand-Entwicklung und Manipulation
  • Operand schobern Management (Stoß / Knall) auf
  • Kontrollübertragung, die (sich) (verzweigt)
  • Methode-Beschwörung und Rückkehr
  • Das Werfen von Ausnahmen
  • Monitor-basierte Parallelität

Das Ziel ist binäre Vereinbarkeit. Jeder besondere Gastgeber Betriebssystem braucht seine eigene Durchführung des JVM und der Durchlaufzeit. Diese JVMs interpretieren den bytecode semantisch derselbe Weg, aber die wirkliche Durchführung kann verschieden sein. Komplizierter als gerade Emulierung bytecode führt die javanische Kern-API vereinbar und effizient durch, die jedem Gastgeber Betriebssystem kartografisch dargestellt werden muss.

Haufen

Java virtueller Maschinenhaufen ist das Gebiet des Gedächtnisses, das durch den JVM, spezifisch HotSpot für die dynamische Speicherzuteilung verwendet ist. Der Haufen wird in Generationen geteilt:

  • Die junge Generation versorgt kurzlebige Gegenstände, die geschaffen werden und sofort gesammelter Müll.
  • Gegenstände, die länger andauern, werden zur alten Generation bewegt (auch hat die tenured Generation genannt).
  • Die dauerhafte Generation (oder permgen) wird für Klassendefinitionen verwendet und metadata vereinigt.

Ursprünglich gab es keine dauerhafte Generation, und Gegenstände und Klassen wurden zusammen im gemeinsamen Bereich versorgt. Aber weil Klasse, die ausgeladen wird, viel seltener vorkommt, als Gegenstände gesammelt werden, bewegende Klassenstrukturen zu einem spezifischen Gebiet erlaubt bedeutende Leistungsverbesserungen.

Sichere Ausführung des entfernten Codes

Eine virtuelle Maschinenarchitektur erlaubt sehr feinkörnige Kontrolle über die Handlungen, die innerhalb der Maschine codieren, wird erlaubt zu nehmen. Das wird entworfen, um sichere Ausführung des unvertrauten Codes von entfernten Quellen, ein Modell zu erlauben, das durch Java applets verwendet ist. Applets laufen innerhalb eines in einen Browser eines Benutzers vereinigten VM, von einem entfernten HTTP Server heruntergeladenen Code durchführend. Der entfernte Code läuft in einem eingeschränkten Sandkasten, der entworfen wird, um den Benutzer vor der Ungezogenheit oder dem böswilligen Code zu schützen. Herausgeber können ein Zertifikat kaufen, mit dem man applets als sicher digital unterzeichnet, ihnen Erlaubnis gebend, den Benutzer zu bitten, aus dem Sandkasten zu brechen und auf das lokale Dateisystem, die Zwischenablage oder das Netz zuzugreifen.

C zu bytecode Bearbeitern

Aus dem Gesichtspunkt eines Bearbeiters Java ist virtuelle Maschine gerade ein anderer Verarbeiter mit einem Befehlssatz, Java bytecode, für den Code erzeugt werden kann. Der JVM wurde ursprünglich entworfen, um auf der javanischen Sprache geschriebene Programme durchzuführen. Jedoch stellt der JVM eine Ausführungsumgebung in der Form eines bytecode Befehlssatzes und eines Laufzeitsystems zur Verfügung, das allgemein genug ist, dass es als das Ziel für Bearbeiter anderer Sprachen verwendet werden kann.

Wegen seiner nahen Vereinigung mit der javanischen Sprache führt der JVM die strengen durch die javanische Spezifizierung beauftragten Laufzeitkontrollen durch. Das verlangt, dass C zu bytecode Bearbeitern ihre eigene lockere Maschinenabstraktion zur Verfügung stellt, zum Beispiel kompilierten Code erzeugend, der eine javanische Reihe verwendet, um Hauptgedächtnis zu vertreten (so können Zeigestöcke zu ganzen Zahlen kompiliert werden), und Verbindung der C Bibliothek zu einer zentralisierten javanischen Klasse, die mit Systemanrufen wetteifert. Die meisten oder alle Bearbeiter haben unter dem Gebrauch eine ähnliche Annäherung verzeichnet.

Mehrere C zu bytecode Bearbeitern bestehen:

  • NestedVM übersetzt C in die MIPS Maschinensprache zuerst vor dem Umwandeln nach Java bytecode.
  • Cibyl arbeitet ähnlich zu NestedVM, aber nimmt J2ME Geräte ins Visier.
  • LLJVM kompiliert C zu LLVM IR, der dann zu JVM bytecode übersetzt wird.
  • C2J ist auch GCC-basiert, aber er erzeugt intermediären javanischen Quellcode vor dem Erzeugen bytecode. Unterstützt den vollen ANSI C Durchlaufzeit.
  • Axiomatische Mehrplattform C unterstützt vollen ANSI C 1989, SWT und J2ME CDC 1.1 für bewegliche Geräte.
  • Java Backend für GCC, vielleicht das älteste Projekt seiner Art, wurde an Der Universität von Queensland 1999 entwickelt.
  • Javum ist ein Versuch, die volle GNU-Umgebung zum JVM zu tragen, und schließt einen der obengenannten mit zusätzlichen Dienstprogrammen paketierten Bearbeiter ein.

Bearbeiter, die Java bytecode ins Visier nehmen, sind für andere Programmiersprachen, einschließlich Adas und COBOL geschrieben worden.

Das Genehmigen

Mit der javanischen Plattform, Normalen Ausgabe (J2SE) 5.0 anfangend, sind Änderungen zur JVM Spezifizierung unter dem javanischen Gemeinschaftsprozess als JSR 924 entwickelt worden., Änderungen zur Spezifizierung, um Änderungen zu unterstützen, die dem Klassendateiformat (JSR 202) vorgeschlagen sind, werden als eine Wartungsausgabe von JSR 924 getan. Die Spezifizierung für den JVM wird in der Buchform veröffentlicht, die als blaues Buch bekannt ist. Die Einleitungsstaaten:

Der JVM des Orakels wird HotSpot genannt. Sauberes Zimmer javanische Durchführungen schließt Kaffe und IBM J9 ein. Orakel behält Kontrolle über die javanische Handelsmarke, die es verwendet, um Durchführungsgefolge als völlig vereinbar mit der Spezifizierung des Orakels zu bescheinigen.

Siehe auch

  • Liste Javas virtuelle Maschinen
  • Vergleich der Anwendung virtuelle Maschinen
  • Automatisierte Ausnahme, die behandelt
  • Javanische Leistung
  • Liste von JVM Sprachen
  • Javanischer Verarbeiter

Zeichen

Links


James Hamilton, der 1. Graf von Abercorn / John Abercrombie (Arzt)
Impressum & Datenschutz