Подтвердить что ты не робот

Что заставляет метод классифицироваться как "не компилируемый (отключенный)" компилятором hotspot?

После внесения некоторых изменений в приложение он подвергся существенной деградации производительности, и при расследовании один из наиболее часто называемых методов больше не компилируется. Включение: -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 во избежание автобоксинга не имеет значения; этот метод все еще не компилируется.

Я могу "вытолкнуть его палкой", пока не получаю решение, которое делает то, что я хочу (и также компилируюсь), но каковы критерии этого отключения?

4b9b3361

Ответ 1

Я думаю, что основная ошибка с моей стороны - журнал с методом "компиляции отключен" был создан при запуске debug через IntelliJ (хотя при отключенных контрольных точках). Я ожидаю, что IntelliJ отключит компиляции для методов с точками останова, даже если они отключены.

Итак, чтобы ответить на мой собственный вопрос, у меня нет причин думать, что что-то, кроме явно отключенного компиляции, сделает это.