2009-12-28 2 views
6

Hier ist eine Phrase, die ich viel während der High School und Universität Informatik Klassen gehört:Wie unterscheiden sich "moderne JVMs" von älteren JVMs?

„Das ist kein Problem für die moderne JVMs.“

Normalerweise würde dies in Diskussionen über die Gesamtleistung oder Optimierungsstrategien auftauchen. Es wurde immer als eine Art magische letzte Antwort behandelt, als ob es Probleme macht, an die man nicht mehr denken sollte. Und das führt mich zu der Frage: Was sind die Unterschiede zwischen der prototypischen "modernen JVM" und älteren JVMs wirklich?

+1

Der Datumsstempel auf der binären :-P – TofuBeer

+0

@TofuBeer: Vielen Dank, Captain Obvious. Korrekt und präzise, ​​also + 1/akzeptiert. Oh wait ... – Pops

+0

In Verbindung stehende Frage, die das Garbage Collection Bit im Detail erklärt: http://StackOverflow.com/Questions/2931170/does-variable-null-set-it-for-Garbage-Collection – Pops

Antwort

6

Die wichtigste Verbesserung der JVM-Technologie ist der JIT: Just In Time Compiler. Das JIT optimiert den Code während der Ausführung und erzielt dadurch enorme Leistungssteigerungen, was Java (zumindest in einigen Bereichen) gegenüber C/C++ - Programmen wettbewerbsfähig macht.

Eine interessante Diskussion über die Vorteile von dynamischer Optimierung (wie der Code läuft) im Vergleich zu statischer Optimierung (während der Kompilierung) kann in Steve Yegges Vortrag gefunden werden: http://steve-yegge.blogspot.com/2008/05/dynamic-languages-strike-back.html (die, BTW ist in sich selbst interessant).

Andere JVM-Verbesserungen, die nicht völlig unabhängig von JIT sind, sind eine schnellere Verteilung virtueller Methoden, sowohl für Klassenmethoden als auch für Schnittstellenmethoden.

6

Unbeabsichtigte Synchronisation war langsam.
Müllsammlung ist viel schneller geworden.
Hotspot-Optimierung wurde besser.
Einige wirklich alte JVMs hatten ausschließlich green threads.

+1

Ich ging sagen, dass die "moderne JVM" eher eine Aussage über die schlechte Leistung von Proto-JVMs als eine Aussage über die aktuelle Generation ist – Jherico

1

Eine moderne JIT kann aggressiv Maschinencode optimieren, basierend auf Profilinformationen und andere Informationen aus dem Byte-Code abgeleitet:

  • Maschinencode mit einer Optimierungsstufe erzeugt werden kann aus der erwarteten Nutzung abgeleitet (es ist früher ein viel, vielleicht wird es noch mehr benutzt). Das hilft sehr!
  • Aufrufe von object.getFoo() können inline durchgeführt werden, sodass der Inhalt der Methode direkt in den generierten Code ohne den Methodenaufruf eingefügt wird. Dies kann rekursiv durchgeführt werden und dazu führen, dass komplexer Code durch die wenigen tatsächlich ausgeführten Anweisungen ersetzt wird.
  • Die Müllsammlung hat sich enorm verbessert. Dies bedeutet in viel Zeit nicht ausgegeben werden.
Verwandte Themen