Warum ist die JVM startet langsam?
Was genau macht die JVM (insbesondere Sun-Implementierung) langsam zum laufen bekommen im Vergleich zu anderen runtimes wie CPython? Mein Eindruck war, dass es hauptsächlich damit zu tun, mit einer Schiffsladung von Bibliotheken immer geladen, ob man Sie braucht oder nicht, aber das scheint wie etwas, das nicht sollte 10 Jahre dauern, um zu beheben.
Kommen Sie, daran zu denken, wie sieht die JVM-start-Zeit zu vergleichen, um die CLR auf Windows? Wie etwa Mono CLR?
UPDATE: ich bin insbesondere besorgt über die Verwendung bei kleinen utilities verkettet, wie es Häufig bei Unix. Ist Java nun geeignet für diesen Stil? Was startup-overhead von Java entstehen, wird Hinzugefügt bis für jeden Java-Prozess, oder ist der Aufwand nur wirklich manifest für den ersten Prozess?
InformationsquelleAutor der Frage Jegschemesch | 2009-05-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist was Wikipedia zu sagen hat, auf die Frage (mit einigen Referenzen).
Es scheint, dass die meisten der Zeit, die genommen wird nur das laden von Daten (Klassen) von der Festplatte (d.h. Startzeit ist I/O-gebunden).
InformationsquelleAutor der Antwort Naaff
Nur zu beachten, einige Lösungen:
Gibt es zwei Mechanismen, die es ermöglichen, schneller Start JVM.
Die erste ist die Klasse, die Daten-sharing-Mechanismus, unterstützt seit Java 6 Update 21 (nur mit dem HotSpot Client VM, und nur mit der seriellen garbage collector soweit ich weiß)
Um es zu aktivieren, müssen Sie -Xshare (bei einigen Implementierungen: -Xshareclasses ) JVM-Optionen.
Lesen Sie mehr über die Funktion, die Sie besuchen können:
Class data sharing
Der zweite Mechanismus ist ein Java Quick Starter. Es ermöglicht, um die Vorspannung beim Start des Betriebssystems finden Sie unter:
Java Quick Starter für mehr details.
InformationsquelleAutor der Antwort Alexandr
Läuft eine triviale Java-app mit der 1.6 (Java 6) client-JVM scheint augenblicklich auf meinem Rechner. Sun hat versucht, bei der Optimierung der client-JVM für schnellere Starts (und der client-JVM ist der default), so dass, wenn Sie don ' T brauchen viel extra-jar-Dateien, dann Start sollte schnell sein.
InformationsquelleAutor der Antwort jdigital
Wenn Sie mit Sun - HotSpot für x86_64 (64bit kompiliert), beachten Sie, dass die aktuelle Implementierung funktioniert nur im server-Modus, das heißt, es precompiles jeder Klasse und es lädt mit voller Optimierung, in der Erwägung, dass die 32bit version unterstützt auch die client-Modus, die in der Regel verschiebt Optimierung und optimiert die meisten CPU-intensiven nur Ersatzteile, sondern hat schneller start-up-Zeiten.
Siehe zum Beispiel:
Dass gesagt wird, zumindest auf meinem Rechner (Linux x86_64 mit 64-bit-kernel), die die 32-bit-HotSpot-version unterstützt sowohl client-und server-Modus (via -client und -server flags), die aber standardmäßig auf den server-Modus, während die 64bit-version unterstützt nur server-Modus.
InformationsquelleAutor der Antwort Paggas
Es hängt wirklich davon ab, was du tust während dem start. Wenn Sie die run-Anwendung "Hello World" es dauert 0,15 Sekunden auf meinem Rechner.
Jedoch ist Java besser geeignet als ein client oder ein server/Dienst, was bedeutet, dass die startup-Zeit ist nicht so wichtig wie die Verbindung Zeit (etwa 0.025 ms) oder das round-trip-time response time (<< 0.001 ms).
InformationsquelleAutor der Antwort Peter Lawrey
Gibt es eine Reihe von Gründen:
jar
s ladenIch bin mir nicht sicher über die CLR, aber ich denke, es ist oft schneller, da speichert es eine native version von Baugruppen für das nächste mal (so es nicht braucht, JIT). CPython schneller startet, weil es ist ein interpreter, und wenn ich mich Recht erinnere, nicht JIT.
InformationsquelleAutor der Antwort Zifre
Zusätzlich zu den Dingen, die bereits erwähnt (laden von Klassen, esp. aus komprimierten Gläser); ausgeführt im interpretierten Modus, bevor HotSpot kompiliert Häufig verwendeten bytecode; und HotSpot-Kompilierung overhead, es ist auch ganz ein bisschen ein one-time-Initialisierung erfolgt durch JDK-Klassen selbst.
Viele Optimierungen sind gemacht zu Gunsten der länger laufende Systeme, wo die Start-Geschwindigkeit ist weniger ein Problem.
Als unix-Stil pipelining: Sie wollen sicher NICHT, um start und re-start der JVM mehrere Male. Das ist nicht effizient. Eher die Verkettung von Werkzeugen geschehen sollte innerhalb der JVM. Dies kann nicht leicht sein, vermischt mit nicht-Java-Unix-tools, die man ohne solche tools aus, die innerhalb JVM.
InformationsquelleAutor der Antwort StaxMan
Alle VMs mit einem reichen Typ-system, wie zum Beispiel Java oder CLR nicht instanteous, wenn im Vergleich zu weniger reichen Systeme, die beispielsweise in C oder C++. Dies ist vor allem, weil eine Menge passiert ist in der VM, eine Menge von Klassen bekommen initialisiert und sind erforderlich, von einem Laufenden system. Schnappschüsse von einem initialisierten system nicht helfen, aber es kostet immer noch geladen, das Bild wieder in Erinnerung etc.
Einem einfachen "hello world" Stil einer liner-Klasse mit einer main erfordert noch viel zu geladen und initialisiert. Die überprüfung der Klasse erfordert eine Menge Abhängigkeiten zu prüfen und die überprüfung aller Kosten, Zeit und viele CPU-Anweisungen ausgeführt werden. Auf der anderen Seite ein C-Programm wird nicht jeder diese und eine Höhe von ein paar Anweisungen und dann rufen Sie die Drucker-Funktion.
InformationsquelleAutor der Antwort mP.