2014-12-27 13 views
7

zu lösen Ich versuche, eine JIT-Strategie basierend auf Methodenstruktur mit Profilinformationen (von JVM bereitgestellt) zu erstellen, aber ich konnte JIT nicht manuell auslösen. This documantation sagt, ich kann JIT durch Aufrufen von java.lang.Compiler.compileClass() ausführen, aber Methode gibt jedes Mal falsch zurück und die Eigenschaft, die java.lang.Compiler prüft (java.compiler) ist jedes Mal NULL, wenn ich die JVM ausführen. Ich versuchte auf OpenJDK und Oracle JVM 1.7 beide Ergebnisse gleich.Gibt es eine Möglichkeit, JIT manuell anders als java.lang.Compiler

Allerdings, wenn ich die Zusammenstellung Statistiken mit

$ jstat -printcompilation <PID> 

beobachten kann ich den JIT erfolgreich sehen kompiliert eine Methode, die die Bedingungen passt.

Wenn es einen Weg gibt, trigger ich es eher aus Java-Code. Ich habe versucht, in hotspot VM's code auch zu suchen, aber ich konnte die Klasse und die Methode nicht finden, in der die Entscheidung getroffen wurde und JIT anfangen.

Edit: Nachdem ich mich mehr umgesehen habe, fand ich die compilationPolicy.cpp bu konnte immer noch nicht den genauen Standort finden, von dem die Entscheidung abhängen. Ich würde ausnehmen so etwas wie (einfach denken)

if(hot_count > Threshold){ 
    compile_method(methodHandle); 
} 

aber stattdessen fand,

void SimpleCompPolicy::method_invocation_event(methodHandle m, JavaThread* thread) { 
const int comp_level = CompLevel_highest_tier; 
    const int hot_count = m->invocation_count(); 
    reset_counter_for_invocation_event(m); 
    const char* comment = "count"; 

    if (is_compilation_enabled() && can_be_compiled(m)) { 
    nmethod* nm = m->code(); 
    if (nm == NULL) { 
    // [MY COMMENT] no check being done on hot_count in here or callee methods 
     CompileBroker::compile_method(m, InvocationEntryBci, comp_level, m, hot_count, comment, thread); 
    } 
    } 
} 

Soweit die native JVM Code Tracing, im immer mein Hauptthema entfernt. Immer noch auf der Suche nach einer einfachen Lösung in Java-Seite des Codes zu verwenden.

+0

Teil von Java bilden, dass Sie die 'java.compiler' Eigenschaft auf Ihrem Rechner aktiviert? In der Dokumentation, auf die Sie verwiesen haben, wird ausdrücklich darauf verwiesen. Sie können dies mit 'System.out.println (System.getProperty (" java.compiler ")) überprüfen;'. – Makoto

+0

'System.out.println (System.getProperty (" java.compiler "));' Code druckt null. Und ich bin mir nicht sicher, ob ich selbst einen Wert festlegen sollte, selbst wenn ich keine Dokumentation finde, um einen bestimmten Wert festzulegen . –

Antwort

2

Es klingt, als ob Sie etwas ähnlich der Compiler Control-Funktion wünschen (http://openjdk.java.net/jeps/165).

Leider ist es noch nicht existiert, obwohl es derzeit geplant ist Bist Du sicher 9.

+0

Ja, ich möchte so etwas, um genauer Programmsteuerung zu sein. Aber ich verstehe 'java.lang.Compiler' Klassenexistenz im aktuellen JDK nicht. Wenn diese Klasse eine Funktion für verschiedene Anbieter zur Steuerung von JDK ist, bietet hotspot keine Standardimplementierung für die Verwendung von 'Compiler'. –

Verwandte Themen