2013-02-22 3 views
25

Ich habe eine performance-kritische Methode oft aufgerufen, wenn meine App startet. Schließlich wird es JIT-kompiliert, aber nicht nach einer merklichen Zeit, die im Interpreter ausgeführt wird.Kann ich die JVM zwingen, eine bestimmte Methode nativ zu kompilieren?

Gibt es eine Möglichkeit, der JVM zu sagen, dass ich diese Methode von Anfang an kompilieren möchte (ohne andere Interna mit Sachen wie -XX:CompileThreshold zu optimieren)?

+0

Kannst du eine realistische, synthetische Aufwärmphase dieser Methode ausführen oder tut es Dinge, die nicht gefälscht werden können? – Matt

+1

Diese Methode wird verwendet, um große Konfigurationsdateien direkt nach dem Start zu analysieren, und das ist, was ich beschleunigen möchte. Das künstliche Aufwärmen würde wahrscheinlich an dieser Stelle nicht gut tun, ich denke ... –

+0

könnten Sie vielleicht Ihre Konfiguration vereinfachen? ändere es von XML zu einem einfacheren Eigenschaftenformat oder irgendetwas, um die Menge des Codes zu reduzieren, der benötigt wird, um es zu lesen? vielleicht teilen Sie die Konfiguration in einen "Boot" Teil, klein wie möglich, nur um zu starten und einen Hauptteil, den Sie im Hintergrund laden könnten? Vielleicht parallelisieren Sie die Arbeit, obwohl der Code interpretiert wird. – radai

Antwort

32

Die einzige Möglichkeit, die ich kenne, ist die -Xcomp Flagge, aber das ist nicht generell ratsam zu verwenden. Es erzwingt die sofortige JIT-Kompilierung aller Klassen und Methoden, wenn sie zum ersten Mal ausgeführt werden. Der Nachteil ist, dass Sie bei der ersten Inbetriebnahme (aufgrund der erhöhten JIT-Aktivität) eine Leistungsminderung feststellen werden. Die andere große Einschränkung bei diesem Flag besteht darin, dass die inkrementelle profilierungsbasierte Optimierung, die JIT normalerweise ausführt, deaktiviert wird. Im gemischten Standardmodus kann (und wird) der JIT-Compiler Teile des Codes basierend auf gesammelten Profilierungs- und Laufzeitinformationen kontinuierlich optimieren und neu kompilieren. Dadurch können fehlerhafte Optimierungen wie fehlgeschlagene, aber als notwendig erachtete Grenzwertüberprüfungen, suboptimale Inlinings etc. "korrigiert" werden. -Xcomp deaktiviert die Profiling-basierte Optimierung und kann je nach Programm insgesamt erhebliche Leistungseinbußen für nur einen kleinen Teil verursachen oder keinen wirklichen Gewinn beim Start, weshalb es nicht empfohlen wird zu verwenden.

Beyond -Xcomp (was ziemlich brutal ist) und -XX:CompileThreshold (die steuert, wie viele Ausführungen einer Methode der JIT-Compiler interpretiert wird Modus ausgeführt werden Statistiken zu sammeln, vor dem Kompilieren/Optimierung it), gibt es auch -Xbatch. Dies erzwingt die JIT-Kompilierung in den "Vordergrund", wobei Aufrufe von Methoden im Wesentlichen blockiert werden, bis sie kompiliert wurden, anstatt sie wie üblich im Hintergrund zu kompilieren.

Sie haben nicht angegeben, welche Java-Version Sie verwenden, aber wenn Java 7 eine Option für Sie ist, wird ein neues JIT-Modell namens "Tiered compilation" (aktiviert mit dem Schalter -XX:+TieredCompilation) eingeführt. Bei der mehrstufigen Kompilierung wird eine erste, kleinere Kompilierungsübergabe bei der ersten Verwendung einer Methode und später eine zusätzliche, größere Kompilierung/Optimierung basierend auf gesammelten Profilingdaten ermöglicht. Klingt so, als ob es für dich interessant sein sollte.

Es erfordert angeblich einige zusätzliche Feineinstellungen und Parameter/Konfigurationen, aber ich bin nicht dazu gekommen, es weiter zu überprüfen.

+0

Danke für die schöne Auflistung all dieser Optionen. Schade, dass sie nicht auf ein feineres Level gesetzt werden können ... –

+0

Ich denke, dass TieredCompilation nicht zu viel Schaden anrichten wird, da es auf lange Sicht nichts wirklich ändern wird – radai

2

Ich bin nicht sicher, ob es den Code vollständig vorkompilieren wird, aber Sie könnten Ihre Klasse mit der kritischen Methode zum freigegebenen Datenabbild der JVM hinzufügen. Weitere Informationen finden Sie unter this question.

auch, haben Sie JNI in Betracht gezogen? Wenn Ihre Methode sehr CPU-intensiv ist, könnte dies die Geschwindigkeit erheblich erhöhen.

+0

Interessant. Es scheint, dass dies nur das Laden von Klassen verbessert und den JIT-Compiler nicht berührt. Oder fehlt mir etwas? Ich möchte JNI vermeiden und nativen Code auf allen Plattformen kompilieren, auf denen wir ... –

Verwandte Themen