2013-02-22 21 views
25

Mam metodę krytyczną dla wydajności, która jest często wywoływana podczas uruchamiania mojej aplikacji. W końcu zostaje skompilowany przez JIT, ale nie po tym, jak jakiś zauważalny czas zostanie uruchomiony w interpreterze.Czy mogę zmusić JVM do natywnego kompilowania danej metody?

Czy jest jakiś sposób mogę powiedzieć JVM, że chcę, aby ta metoda została skompilowana od samego początku (bez poprawiania innych elementów wewnętrznych takich jak -XX:CompileThreshold)?

+0

czy można uruchomić realistyczną, syntetyczną rozgrzewkę tej metody, czy robi to, czego nie można sfałszować? – Matt

+1

Ta metoda jest używana do analizowania dużych plików konfiguracyjnych zaraz po uruchomieniu i właśnie to chcę przyspieszyć. Sztuczna rozgrzewka prawdopodobnie by w tym momencie nie pomogła ... –

+0

Czy mógłbyś uprościć swoją konfigurację? zmienić go z xml na prostszy format właściwości lub cokolwiek, aby zmniejszyć ilość kodu potrzebnego do odczytu? może podzielisz konfigurację na część "rozruchową", tak małą jak to tylko możliwe, aby uruchomić i główną część, którą możesz załadować w tle? może zrównoważyć pracę, więc nawet jeśli kod zostanie zinterpretowany, możesz zyskać na szybkości od owijania go? – radai

Odpowiedz

32

Jedyny znany mi sposób to flaga -Xcomp, ale generalnie nie jest to wskazane. Wymusza natychmiastową kompilację JIT WSZYSTKICH klas i metod przy pierwszym uruchomieniu. Minusem jest spadek wydajności przy pierwszym uruchomieniu (z powodu zwiększonej aktywności JIT). Innym ważnym ograniczeniem związanym z tą flagą jest wyłączenie przyrostowej optymalizacji opartej na profilowaniu, którą normalnie JIT wykonywał. W standardowym trybie mieszanym kompilator JIT może (i będzie) dekompilować i ponownie kompilować części kodu w sposób ciągły w oparciu o zebrane informacje profilowania i wykonywania. Dzięki temu może "poprawić" błędne optymalizacje, takie jak kontrole graniczne, które zostały pominięte, ale okazały się być potrzebne, suboptymalne inlinings itp. -Xcomp wyłącza optymalizację opartą na profilowaniu iw zależności od programu, może spowodować znaczące straty wydajności ogólnie tylko dla małych lub brak prawdziwego zysku podczas uruchamiania, dlatego nie zaleca się go używać.

Beyond -Xcomp (co jest dość brutalny) i -XX:CompileThreshold (który kontroluje ile egzekucje danej metody JIT będzie działać w trybie intepreted do zebrania statystyk przed kompilacją/optymalizując go), istnieje również -Xbatch. Zmusza to kompilację JIT do "pierwszego planu", zasadniczo blokując wywołania metod, dopóki nie zostanie skompilowana, zamiast kompilować je w tle, tak jak zwykle.

Nie określono, która wersja Java jest używana, ale jeśli Java 7 jest opcją dla ciebie, wprowadza nowy model JIT o nazwie "Tiered Compilation" (aktywowany przełącznikiem -XX:+TieredCompilation). Jaka jest wielopoziomowa kompilacja, umożliwia początkową, mniejszą przepustowość kompilacji przy pierwszym użyciu metody, a następnie dodatkową, większą kompilację/optymalizację później, w oparciu o zebrane dane profilowania. Wygląda na to, że powinno być dla ciebie interesujące.

Podobno wymaga dodatkowych ulepszeń i parametrów/konfiguracji, ale nie mam już okazji, by to sprawdzić dalej.

+0

Dzięki za miłą listę wszystkich tych opcji. Szkoda, że ​​nie można ich ustawić na lepszym poziomie ... –

+0

Myślę, że TieredCompilation nie spowoduje zbyt dużych obrażeń, ponieważ nic nie zmieni na dłuższą metę – radai

2

Nie jestem pewien, czy to całkowicie prekompiluje kod, ale możesz dodać swoją klasę krytyczną metodą do udostępnionego zrzutu danych maszyny JVM. Aby uzyskać więcej informacji, patrz this question.

również, czy bierzesz pod uwagę JNI? jeśli twoja metoda jest bardzo obciążająca procesor, może znacznie przyspieszyć działanie.

+0

Interesujące. Wydaje się, że to tylko poprawia ładowanie klasy i nie dotyka jednak kompilatora JIT. Czy może czegoś brakuje? Chciałbym uniknąć JNI i kompilować natywny kod na wszystkich platformach, na których wdrażamy ... –