После внесения некоторых изменений в приложение он подвергся существенной деградации производительности, и при расследовании один из наиболее часто называемых методов больше не компилируется. Включение: -XX:+LogCompilation
показывает, что до изменения этот метод был: поставлен в очередь для компиляции, скомпилирован, а затем успешно привязан к вызывающим; тогда как после изменения нет записи о попытке компиляции, и попытка вложения указывает:
inline_fail reason = 'не компилируется (отключено)'
Исходный метод выглядит следующим образом, где _maxRepeats
- это переменная экземпляра, объявленная как Map
(нет дженериков, написанных давно), используемых таким образом, что ключ был объектом класса DadNode
и значение было Integer
.
private int cnsGetMaxRepeats(DadNode dn) {
if (_maxRepeats != null) {
Integer max = (Integer)_maxRepeats.get(dn);
if (max != null) {
return max;
}
}
return dn.getMaxOccurs().getValue();
}
Поправка включала изменение карты _maxRepeats
для использования дженериков:
Map<Integer, Integer>
и новый метод был добавлен в метод:
private int cnsGetMaxRepeats(int childIdx, DadNode dn) {
if (_maxRepeats != null) {
Integer max = _maxRepeats.get(childIdx);
if (max != null) {
return max;
}
}
return dn.getMaxOccurs().getValue();
}
Использование явных вызовов Integer.valueOf
и Integer.intValue
во избежание автобоксинга не имеет значения; этот метод все еще не компилируется.
Я могу "вытолкнуть его палкой", пока не получаю решение, которое делает то, что я хочу (и также компилируюсь), но каковы критерии этого отключения?