2014-12-27 13 views
7

Próbuję utworzyć strategię JIT na podstawie struktury metody z informacjami profilowania (dostarczonymi przez JVM), ale nie udało mi się ręcznie uruchomić JIT. This documantation mówi, że mogę uruchomić JIT, wywołując java.lang.Compiler.compileClass(), ale metoda zwraca wartość false za każdym razem, a właściwość, którą sprawdza java.lang.Compiler (java.compiler) ma wartość null za każdym razem, gdy uruchamiam JVM. Próbowałem na OpenJDK i Oracle JVM 1.7 oba wyniki są takie same.Czy istnieje sposób ręcznego wyzwalania JIT innego niż java.lang.Compiler

Jednak kiedy obserwować statystyki kompilacji z

$ jstat -printcompilation <PID> 

widzę pomyślnie JIT kompiluje jakąś metodę, która pasuje do warunków.

Jeśli istnieje jakikolwiek sposób, a raczej uruchomić go z kodu Java. Próbowałem również wyszukać w hotspot VM's code, ale nie mogłem zlokalizować klasy i metody, w których podjęto decyzję i JIT.

Edytuj: Po rozejrzeniu się i stwierdziłem, że compilationPolicy.cpp bu nadal nie może znaleźć dokładnej lokalizacji, od której zależy decyzja. Chciałbym coś takiego (except prostu myśląca)

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

ale zamiast znaleźć to,

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); 
    } 
    } 
} 

Jeśli chodzi o śledzenie kodu macierzystego JVM, im uciec mój główny wątek. Nadal szukasz prostego rozwiązania do zastosowania po stronie java kodu.

+0

Czy jesteś pewien, że masz 'nieruchomość java.compiler' włączona na komputerze? Dokumentacja, do której się odwołuje, stanowi wyraźne odniesienie do tego, które należy ustawić. Możesz sprawdzić przy pomocy 'System.out.println (System.getProperty (" java.compiler "));'. – Makoto

+0

'System.out.println (System.getProperty (" java.compiler "));' kod wypisuje null.I nie jestem pewien, czy powinienem ustawić wartość samodzielnie, nawet jeśli nie mogę znaleźć żadnej dokumentacji, aby ustawić określoną wartość . –

Odpowiedz

2

Wygląda na to, że chcesz coś podobnego do funkcji kontroli kompilacji (http://openjdk.java.net/jeps/165).

Niestety, jeszcze nie istnieje, choć jest obecnie planowane są częścią Java 9.

+0

Tak, chcę czegoś takiego, aby być bardziej szczegółową kontrolą programową. Ale nie rozumiem istnienia klasy 'java.lang.Compiler' w bieżącym JDK. Jeśli ta klasa jest funkcją dla różnych dostawców do kontrolowania JDK, dlaczego hotspot nie zapewnia domyślnej implementacji do używania "Kompilatora". –

Powiązane problemy