Frage

Die JVM (vor allem der HotSpot VM) ist bekannt eine Vielzahl von Optimierungen für mit zur Laufzeit anwenden kann.

Gibt es eine Möglichkeit zu einem bestimmten Stück Code zu schauen und sehen, was die JVM hat es tatsächlich getan?

War es hilfreich?

Lösung

Ein Problem ist, dass „was JVM hat tatsächlich getan, um es“ Änderungen zwischen Anrufungen als JVM kostenlos zum Wieder Code generiert.

Als Beispiel ich vor einigen Tagen untersucht, was Hotspot funktioniert mit final Methoden im Vergleich zu virtuellen Methoden. Gemessen an Microbenchmarks, meine Schlussfolgerungen waren:

  • Client JVM: Wenn die Methode ist effektiv final (es gibt keine geladene Klasse, die überschreibt sie), die JVM einen nicht-virtuellen Aufruf verwendet. Danach, wenn Sie eine Klasse laden, die diese Methode überschreibt, wird die JVM den JIT'ed Code ändern sich die Anrufe virtuellen zu machen. So erklärt als finalhas keine wesentliche Relevanz.

  • Server JVM: Hier scheint final entweder keine Relevanz zu haben. Was zu geschehen scheint, ist, dass die JVM einen nicht virtuellen Aufruf erzeugt für was auch immer Klasse, die Sie mit dem ersten Mal, , unabhängig von welchen Klassen geladen werden. Danach, wenn Sie einen Anruf von einem Objekt einer anderen Klasse zu machen, wird die JVM alle Anrufe mit ähnlichen etwas Patch dazu (ich glaube, dass es auch Anrufe Profil wird so kann es schnell Pfad und langsam Pfad ändern, wenn es nicht bekommen es gleich beim ersten Mal):

    if (object instanceof ClassOfNonVirtualCall) {
        do non-virtual call to ClassOfNonVirtualCall.method
    } else {
        do virtual call to object.method
    }

Wenn Sie wirklich interessiert sind in generierten Code zu sehen, Sie mit DEBUG JVMs von OpenJDK spielen kann:

http://dlc.sun.com.edgesuite.net /jdk7/binaries/index.html

http://wikis.sun.com/display/HotSpotInternals/PrintAssembly

Andere Tipps

Dies ist sehr JVM spezifisch, und Sie werden wahrscheinlich müssen einige ernsthafte Untersuchung in der speziellen JVM tun bei Ihnen suchen.

Sie können die verfügbaren HotSpot VM-Optionen finden Sie hier http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

Im Folgenden ist eine sehr gute Ressource:

http://wikis.sun.com/display/HotSpotInternals/Home

Besonders interessant sind die „LogCompilation Tool“ und „LogCompilation Übersicht“ Links (nicht senden Sie direkte Verbindungen wie ich gerade registriert haben).

Hier ist eine gute Seite auf HotSpot Optimierungen . Einige der Optimierungen können, indem man die vom Compiler emittiert Bytecode zu sehen. Weitere Optimierungen sind dynamisch und existieren nur während der Laufzeit. Zum Beispiel kann HotSpot tun on-Stack Ersatz welche modifiziert der Stapel direkt während der Laufzeit.

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