Frage

Was genau die JVM macht (insbesondere Suns Implementierung) langsam im Vergleich wie CPython zu anderen Runtimes zum Laufen zu bringen? Mein Eindruck war, dass es in erster Linie mit einer Schiffsladung von Bibliotheken zu tun hat, immer geladen, ob sie gebraucht wird oder nicht, aber das scheint wie etwas, das nicht mehr als 10 Jahre dauern soll zu beheben.

Kommen Sie, daran zu denken, wie funktioniert die JVM-Startzeit auf die CLR auf Windows vergleichen? Wie wäre es Monos CLR?

UPDATE: Ich bin vor allem mit dem Einsatz bei kleinen Versorgungs besorgt aneinander gekettet wie in Unix üblich ist. Ist Java jetzt geeignet für dieses Design? Was auch immer Startoverhead Java entstehen, es addiert sich für jeden Java-Prozess, oder tut den Aufwand nur wirklich Manifest für den ersten Prozess?

War es hilfreich?

Lösung

Hier ist was Wikipedia hat über die Frage sagen (mit einigen Referenzen) .

Es scheint, dass die meiste Zeit nur genommen wird, um Daten (Klassen) von der Festplatte geladen (das heißt die Startzeit ist I / O-bound).

Andere Tipps

Nur einige Lösungen zu beachten:

Es gibt zwei Mechanismen, die zu einem schnelleren Inbetriebnahme JVM ermöglichen. Die erste ist die Klasse Daten-Sharing-Mechanismus, dass seit Java 6 Update unterstützt wird 21 (nur mit dem HotSpot Client-VM, und nur mit der seriellen Garbage Collector, soweit ich weiß)

Um es zu aktivieren, müssen Sie auf -Xshare (bei einigen Implementierungen: -Xshareclasses ). JVM-Optionen

Um mehr über die Funktion lesen Sie besuchen können: Klasse gemeinsame Nutzung von Daten

Der zweite Mechanismus ist ein Java Quick Starter. Es ermöglicht Klassen beim OS-Start vorzuladen finden Sie unter: Java Quick Starter für weitere Details.

Ausführen eine triviale Java-Anwendung mit dem 1.6 (Java 6) Client JVM auf meinem Rechner augenblicklich scheint. Sun hat zu stimmen versucht, die Client-JVM für eine schnellere Inbetriebnahme (und der Client JVM ist die Standardeinstellung), wenn Sie also viele zusätzliche JAR-Dateien nicht benötigen, dann sollten Inbetriebnahme schnell sein.

Wenn Sie Sun HotSpot für x86_64 (64bit kompiliert) verwenden, beachten Sie, dass die aktuelle Implementierung nur im Server-Modus arbeitet, das heißt, es Vorkompilierung jede Klasse mit voller Optimierung lädt, während die 32-Bit-Version unterstützt auch Client-Modus, die im allgemeinen vertagt Optimierung und optimiert die meisten CPU-intensive Teile nur, sondern hat schnellere Startzeiten.

Siehe zum Beispiel:

aber sagen, dass zumindest auf meinem Rechner (Linux x86_64 mit 64-Bit-Kernel) unterstützt die 32-Bit-Version HotSpot sowohl Client- als auch Server-Modus (über die -Client und -Server Flags), aber standardmäßig auf Server-Modus, während die 64-Bit Version unterstützt nur Server-Modus.

Es hängt wirklich davon ab, was Sie während der Inbetriebnahme tun. Wenn Sie Hallo Welt Anwendung ausführen dauert es 0,15 Sekunden auf meinem Rechner.

Allerdings Java ist besser geeignet als Client läuft oder einen Server / Dienst, die die Startzeit bedeutet, ist nicht so wichtig wie die Verbindungszeit (etwa 0,025 ms) oder die Umlaufzeit Reaktionszeit (<< 0,001 ms ).

Es gibt eine Reihe von Gründen:

  • viele jars laden
  • Überprüfung (sicher Code machen böse Dinge nicht tun)
  • JIT (Just in Time-Kompilierung) Overhead

Ich bin mir nicht sicher über die CLR, aber ich denke, es ist oft schneller, weil es eine native Version von Baugruppen für die nächste Zeit-Caches (so es muss nicht JIT). CPython startet schneller, weil es ein Dolmetscher ist, und IIRC, JIT nicht tun.

Neben Dinge bereits erwähnt (Belastungsklassen, besonders aus komprimierten JAR-Dateien.); im interpretierten Modus vor HotSpot läuft kompiliert häufig verwendeten Bytecode; und HotSpot Kompilierungsaufwand gibt es auch einiges an einmaliger Initialisierung von JDK-Klassen getan selbst. Viele Optimierungen werden für länger laufende Systeme durchgeführt, wo Startgeschwindigkeit weniger problematisch ist.

Und wie in der Unix-Stil Pipelining: Sie wollen sicher nicht starten, und starten Sie JVM mehrere Male. Das wird nicht effizient sein. Vielmehr Verkettung von Werkzeugen innerhalb JVM passieren sollte. Dies kann nicht einfach mit Nicht-Java-Unix-Tools miteinander vermischt werden, mit Ausnahme von solchen Werkzeugen aus JVM zu starten.

Alle VMs mit einem reichen Typsystem wie Java oder CLR werden nicht sein, wenn augenblickliche Vergleich zu weniger reichen Systemen, wie sie in C oder C ++ gefunden. Dies ist vor allem, weil eine Menge passiert in der VM, bekommen viele Klassen initialisierte und werden von einem laufenden System erforderlich. Snapshots von einem initialisierten System helfen, aber es kostet immer noch das Bild zurück in den Speicher usw. zu laden.

Eine einfache Hallo Welt gestylt einzeiler Klasse mit einem Haupt noch viel erfordert geladen und initialisiert wird. alle, die Kosten Zeit und viele CPU-Befehle ausgeführt werden, um eine Menge von Abhängigkeitsprüfung und Validierung erfordert die Klasse zu überprüfen. Auf der anderen Seite wird ein C-Programm nicht davon tun und wird von ein paar Anweisungen betragen und dann die Druckfunktion aufrufen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top