2017-06-29 15 views
10

Po wprowadzeniu pewnych zmian w aplikacji, nastąpiła znaczna degradacja wydajności i podczas dochodzenia jedna z najczęściej wywoływanych metod nie jest już kompilowana. Włączając: -XX:+LogCompilation pokazuje, że przed zmianą ta metoda: czekała w kolejce na kompilację, została skompilowana, a następnie z powodzeniem wprowadzona do rozmówców; natomiast po zmianie, nie ma żadnej wzmianki o próbie kompilacji i próba inline mówi:Co powoduje, że metoda jest klasyfikowana jako "nie kompilowana (wyłączona)" przez kompilator hotspot?

inline_fail powodem = „Nie compilable (wyłączone)”

oryginalna metoda jest następująca, gdzie _maxRepeats jest zmienną instancji zadeklarowaną jako Map (bez generycznych kodów, napisany dawno temu), używaną w taki sposób, że klucz był obiektem klasy DadNode, a wartością był Integer.

private int cnsGetMaxRepeats(DadNode dn) { 
    if (_maxRepeats != null) { 
     Integer max = (Integer)_maxRepeats.get(dn); 
     if (max != null) { 
     return max; 
     } 
    } 
    return dn.getMaxOccurs().getValue(); 
    } 

Nowelizacja zaangażowany zmienia mapę _maxRepeats użyć rodzajowych:

Map<Integer, Integer> 

i nowy parametr został dodany do metody:

private int cnsGetMaxRepeats(int childIdx, DadNode dn) { 
    if (_maxRepeats != null) { 
     Integer max = _maxRepeats.get(childIdx); 
     if (max != null) { 
     return max; 
     } 
    } 
    return dn.getMaxOccurs().getValue(); 
    } 

Korzystanie wyraźnych połączeń do Integer.valueOf i Integer.intValue do unikać autoboxingu nie ma znaczenia; metoda nadal nie jest kompilowalna.

Mogę "szturchać to kijem", dopóki nie otrzymam rozwiązania, które robi to, co chcę (i jest również kompilowane), ale jakie są kryteria tego wyłączenia?

+0

Może być oznaczony jako nieprzydatny z przyczyn niezwiązanych z samym kodem. Na przykład, czy próbowałeś zwiększyć rozmiar pamięci podręcznej kodu? '-XX: ReservedCodeCacheSize' – Gene

+0

Jakiej wersji Java używasz? Czy system operacyjny jest 32-bitowy czy 64-bitowy? Czy używasz kompilatora klienta lub kompilatora serwera? –

+0

jakiej wersji używasz? 'LogCompilation' to' PrintCompilation' przez długi czas ... – Eugene

Odpowiedz

2

Myślę, że podstawowy błąd z mojej strony - dziennik z metodą "kompilacji wyłączone" został utworzony podczas uruchamiania debugowania za pośrednictwem IntelliJ (chociaż z wyłączonymi punktami przerwania). Oczekuję, że IntelliJ wyłączy kompilacje dla metod z punktami przerwania, nawet jeśli są wyciszone.

Więc, aby odpowiedzieć na moje własne pytanie, nie mam powodu, aby sądzić, że zrobi to cokolwiek poza wyraźnie wyłączającą kompilacją.

Powiązane problemy