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?
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
Jakiej wersji Java używasz? Czy system operacyjny jest 32-bitowy czy 64-bitowy? Czy używasz kompilatora klienta lub kompilatora serwera? –
jakiej wersji używasz? 'LogCompilation' to' PrintCompilation' przez długi czas ... – Eugene