Wat is het verschil tussen DVM en JVM?

1. Inleiding

In dit artikel onderzoeken we de verschillen tussen de Java virtuele machine (JVM) en de Dalvik virtuele machine (DVM). We bekijken ze eerst even en maken dan een vergelijking.

2. Wat is een looptijd?

Een runtime-systeem biedt een omgeving voor vertaal de code die is geschreven in een taal op hoog niveau, zoals Java, naar machinecode en begrijpelijk voor de Central Process Unit (CPU).

We kunnen deze soorten vertalers onderscheiden:

  • Assemblers: ze vertalen assemblagecodes direct naar machinecode, dus het is snel
  • Compilers: ze vertalen de code in assembly-code en gebruiken vervolgens assemblers om de resulterende code in binair te vertalen. Het gebruik van deze techniek is traag, maar de uitvoering is snel. Ook is de resulterende machinecode platformafhankelijk
  • Tolken: ze vertalen de code terwijl ze deze uitvoeren. Aangezien de vertaling tijdens runtime plaatsvindt, kan de uitvoering traag zijn

3. Java virtuele machine

De JVM is een virtuele machine om Java-desktop-, server- en webtoepassingen uit te voeren. Een ander belangrijk aspect van Java is dat het is ontwikkeld met het oog op draagbaarheid. Dus, de JVM is ook ontworpen om meerdere hostarchitecturen te ondersteunen en overal te draaien. Maar het is te zwaar voor embedded apparaten.

Java heeft een actieve community en zal in de toekomst op grote schaal worden gebruikt. Bovendien is HotSpot de referentie-implementatie van JVM. Daarnaast worden er ook meer dan vijf andere implementaties onderhouden door de Open Source Community.

Met de nieuwe op cadans gebaseerde release ontvangen Java en de JVM elke zes maanden nieuwe updates. We kunnen bijvoorbeeld enkele voorstellen noemen voor de volgende releases, zoals Foreign-Memory Access en Packaging Tool.

4. Dalvik virtuele machine

De DVM is een virtuele machine om Android-applicaties uit te voeren. De DVM voert de Dalvik-bytecode uit, die is samengesteld uit programma's die in de Java-taal zijn geschreven. Merk op dat de DVM geen JVM is.

Een van de belangrijkste ontwerpprincipes van de DVM is dat het zou moeten werken op mobiele apparaten met weinig geheugen en laadt sneller in vergelijking met welke JVM dan ook. Deze virtuele machine is ook efficiënter wanneer deze meerdere instanties op hetzelfde apparaat uitvoert.

In 2014 bracht Google Android Runtime (ART) voor Android 5 uit, dat Dalvik verving voor een verbeterd batterijgebruik van de applicatieprestaties. De laatste versie was 1.6.0 op Android 4.4.

5. Verschil tussen JVM en DVM

5.1. Architectuur

De JVM is een op een stapel gebaseerde VM waar alle rekenkundige en logische bewerkingen worden uitgevoerd via push- en pop-operanden en de resultaten worden opgeslagen op de stapel. De stapel is ook de datastructuur om methoden op te slaan.

Daarentegen is de DVM een op register gebaseerde VM. Deze registers in de CPU voeren alle rekenkundige en logische bewerkingen uit. Het register is de datastructuur om operanden op te slaan.

5.2. Compilatie

Java-code wordt binnen de JVM gecompileerd naar een intermediair formaat genaamd Java-bytecode (.class-bestanden). Dan is de JVM parseert de resulterende Java-bytecode en vertaalt deze naar machinecode.

Op een Android-apparaat compileert de DVM de Java-code naar een tussenliggende indeling die Java-bytecode (.class-bestand) wordt genoemd, zoals de JVM. Vervolgens, met behulp van een tool genaamd Dalvik eXchange of dx, het transformeert de Java-bytecode naar de Dalvik-bytecode. Tenslotte, de DVM vertaalt de Dalvik-bytecode naar binaire machinecode.

Beide VM's gebruiken de Just-In-Time (JIT) -compiler. De JIT-compiler is een type compiler dat de compilatie tijdens de runtime uitvoert.

5.3. Prestatie

Zoals eerder gezien, is JVM een Stack-gebaseerde VM en is DVM een Register-gebaseerde VM. Stack-gebaseerde VM-bytecode is erg compact omdat de locatie van operanden impliciet op de operand-stack staat. Op register gebaseerde VM-bytecode vereist dat alle impliciete operanden deel uitmaken van een instructie. Dat geeft aan dat de Op register gebaseerde codegrootte zal gewoonlijk veel groter zijn dan op Stack gebaseerde bytecode.

Aan de andere kant kunnen op register gebaseerde VM's berekeningen uitdrukken met minder VM-instructies dan een corresponderende stack-gebaseerde VM. Het verzenden van een VM-instructie is duur, dus de vermindering van uitgevoerdVM-instructies zullen waarschijnlijk de snelheid van de registergebaseerde VM aanzienlijk verbeteren.

Dit onderscheid is natuurlijk alleen relevant wanneer de VM in geïnterpreteerde modus wordt uitgevoerd.

5.4. Executie

Hoewel het mogelijk is om een ​​instantie van de JVM in te stellen per actieve applicatie, configureren we doorgaans slechts één enkele instantie van een JVM met gedeelde processen en geheugenruimte om alle applicaties die we hebben geïmplementeerd uit te voeren.

Android is echter ontworpen om meerdere DVM-instanties uit te voeren. Dus om een ​​applicatie of een service uit te voeren, moet de Android OS maakt een nieuwe DVM-instantie met een apart proces in gedeelde geheugenruimte en implementeert de code om de applicatie uit te voeren.

6. Conclusie

In deze tutorial hebben we de belangrijkste verschillen tussen de JVM en DVM gepresenteerd. Beide VM's draaien applicaties die in Java zijn geschreven, maar ze gebruiken verschillende technieken en processen om code te compileren en uit te voeren.