Was ist der Unterschied zwischen DVM und JVM?

1. Einleitung

In diesem Artikel werden die Unterschiede zwischen der Java Virtual Machine (JVM) und der Dalvik Virtual Machine (DVM) untersucht . Wir werden uns zuerst jeden einzelnen kurz ansehen und dann einen Vergleich anstellen.

2. Was ist eine Laufzeit?

Ein Laufzeitsystem bietet eine Umgebung, um den in einer höheren Sprache wie Java geschriebenen Code in Maschinencode zu übersetzen , der für die Central Process Unit (CPU) verständlich ist.

Wir können diese Arten von Übersetzern unterscheiden:

  • Assembler: Sie übersetzen Assembler-Codes direkt in Maschinencode, damit es schnell geht
  • Compiler: Sie übersetzen den Code in Assembler-Code und verwenden dann Assembler, um den resultierenden Code in Binärcode zu übersetzen. Die Verwendung dieser Technik ist langsam, aber die Ausführung ist schnell. Der resultierende Maschinencode ist auch plattformabhängig
  • Dolmetscher: Sie übersetzen den Code während der Ausführung. Da die Übersetzung zur Laufzeit erfolgt, kann die Ausführung langsam sein

3. Java Virtual Machine

Die JVM ist eine virtuelle Maschine zum Ausführen von Java-Desktop-, Server- und Webanwendungen. Ein weiteres wichtiges Merkmal von Java ist, dass es unter Berücksichtigung der Portabilität entwickelt wurde. Daher wurde die JVM so gestaltet, dass sie auch mehrere Host-Architekturen unterstützt und überall ausgeführt werden kann . Für eingebettete Geräte ist es jedoch zu schwer.

Java hat eine aktive Community und wird auch in Zukunft weit verbreitet sein. Darüber hinaus ist HotSpot die JVM-Referenzimplementierung. Darüber hinaus werden von der Open Source Community mehr als fünf weitere Implementierungen verwaltet.

Mit der neuen kadenzbasierten Version erhalten Java und die JVM alle sechs Monate neue Updates. Zum Beispiel können wir einige Vorschläge für die nächsten Versionen auflisten, wie z. B. Foreign-Memory Access und Packaging Tool.

4. Dalvik Virtual Machine

Der DVM ist eine virtuelle Maschine zum Ausführen von Android-Anwendungen. Der DVM führt Dalvik-Bytecode aus, der aus Programmen kompiliert wird, die in der Java-Sprache geschrieben sind. Beachten Sie, dass das DVM keine JVM ist.

Eines der wichtigsten Konstruktionsprinzipien des DVM ist, dass es auf mobilen Geräten mit geringem Arbeitsspeicher ausgeführt werden kann und im Vergleich zu jeder JVM schneller geladen wird . Diese VM ist auch effizienter, wenn mehrere Instanzen auf demselben Gerät ausgeführt werden.

Im Jahr 2014 veröffentlichte Google Android Runtime (ART) für Android 5, das Dalvik ersetzte, um die Akkuladung der Anwendungsleistung zu verbessern. Die letzte Version war 1.6.0 auf Android 4.4.

5. Unterschied zwischen JVM und DVM

5.1. Die Architektur

Die JVM ist eine stapelbasierte VM, bei der alle arithmetischen und logischen Operationen über Push- und Pop-Operanden ausgeführt werden und die Ergebnisse auf dem Stapel gespeichert werden. Der Stapel ist auch die Datenstruktur zum Speichern von Methoden.

Im Gegensatz dazu ist der DVM eine registergestützte VM . Diese in der CPU befindlichen Register führen alle arithmetischen und logischen Operationen aus. Das Register ist die Datenstruktur zum Speichern von Operanden.

5.2. Zusammenstellung

Java-Code wird innerhalb der JVM in ein Zwischenformat namens Java-Bytecode (.class-Dateien) kompiliert. Anschließend analysiert die JVM den resultierenden Java-Bytecode und übersetzt ihn in Maschinencode .

Auf einem Android-Gerät kompiliert der DVM den Java-Code in ein Zwischenformat namens Java-Bytecode (.class-Datei) wie die JVM. Mit Hilfe eines Tools namens Dalvik eXchange oder dx wird Java-Bytecode in Dalvik-Bytecode umgewandelt . Schließlich übersetzt der DVM den Dalvik-Bytecode in binären Maschinencode .

Beide VMs verwenden den Just-In-Time-Compiler (JIT) . Der JIT-Compiler ist ein Compilertyp, der die Kompilierung zur Laufzeit durchführt.

5.3. Performance

Wie bereits erwähnt, ist JVM eine stapelbasierte VM und DVM eine registrierungsbasierte VM. Der stapelbasierte VM-Bytecode ist sehr kompakt, da die Position der Operanden implizit auf dem Operandenstapel liegt. Für den registergestützten VM-Bytecode müssen alle impliziten Operanden Teil einer Anweisung sein. Dies zeigt an, dass die registrierungsbasierte Codegröße normalerweise viel größer als der stapelbasierte Bytecode ist.

Andererseits können registergestützte VMs Berechnungen mit weniger VM-Anweisungen ausdrücken als eine entsprechende stapelbasierte VM. Das Versenden eines VM-Befehls ist kostspielig, sodass die Reduzierung der ausgeführten VM-Befehle die Geschwindigkeit der registrierungsbasierten VM wahrscheinlich erheblich verbessern wird .

Diese Unterscheidung ist natürlich nur relevant, wenn die VM im interpretierten Modus ausgeführt wird.

5.4. Ausführung

Obwohl es möglich ist, eine Instanz der JVM pro laufender Anwendung einzurichten, konfigurieren wir normalerweise nur eine einzige Instanz einer JVM mit gemeinsam genutzten Prozessen und Speicherplatz, um alle von uns bereitgestellten Anwendungen auszuführen.

Android wurde jedoch so konzipiert, dass mehrere DVM-Instanzen ausgeführt werden. Um eine Anwendung oder einen Dienst auszuführen, erstellt das Android-Betriebssystem eine neue DVM-Instanz mit einem separaten Prozess im gemeinsam genutzten Speicherbereich und stellt den Code zum Ausführen der Anwendung bereit.

6. Fazit

In diesem Tutorial haben wir die Hauptunterschiede zwischen JVM und DVM vorgestellt. Beide VMs führen in Java geschriebene Anwendungen aus, verwenden jedoch unterschiedliche Techniken und Prozesse zum Kompilieren und Ausführen von Code.