Отключить Java JIT для определенного метода/класса?

У меня проблема в моем Java-приложении, где JIT ломает код. Если отключить JIT, все работает нормально, но работает в 10-20 раз медленнее.

Есть ли способ отключить JIT для определенного метода или класса?

Редактировать: я использую Ubuntu 10.10, получая одинаковые результаты:

OpenJDK Runtime Environment (IcedTea6 1.9) (6b20-1.9-0ubuntu1)
OpenJDK 64-Bit Server VM (build 17.0-b16, mixed mode)

и:

Java(TM) SE Runtime Environment (build 1.6.0_16-b01)
Java HotSpot(TM) 64-Bit Server VM (build 14.2-b01, mixed mode)

person Ralf    schedule 23.10.2010    source источник
comment
Вы уже сообщили об ошибке? Или вы нашли существующую ошибку, которая описывает вашу проблему?   -  person soc    schedule 23.10.2010
comment
Очень маловероятно, что это из-за JIT, не так ли? Не может ли это быть из-за состояния гонки (поскольку время меняется, когда вы отключаете jit)...   -  person aioobe    schedule 23.10.2010
comment
Я использую только один поток. Я занят поиском ошибки, но сейчас у меня нет времени. Ошибка возникает постоянно после того, как определенный метод был скомпилирован JIT. Пока я просто устанавливаю параметр -XX:CompileThreshold достаточно высоким.   -  person Ralf    schedule 23.10.2010
comment
Вы пробовали более позднюю версию JDK?   -  person Romain Hippeau    schedule 23.10.2010
comment
Обвинение JVM обычно должно быть довольно далеко в списке :)   -  person bwawok    schedule 23.10.2010
comment
Я посмотрю, кто виноват, позже, когда у меня будет время, но сейчас отключение JIT для определенного метода устраняет мою проблему.   -  person Ralf    schedule 23.10.2010


Ответы (2)


Следующая опция работает на моих JVM, чтобы исключить определенный метод:

-X:CompileCommand=exclude,the/package/and/Class,methodName
person Ralf    schedule 23.10.2010
comment
Sun/Oracle Java 6 и выше используют опцию -XX:CompileCommand. См. java параметры для получения дополнительной информации, в частности для v8. - person Alexey Ivanov; 10.11.2014
comment
Извините, что выкопал такой старый пост; если бы я использовал это с именованным внутренним классом, разделил бы я его как com/domain/package/Outer/Inner или com/domain/package/Outer$Inner? - person nanofarad; 23.02.2015
comment
Я столкнулся с той же проблемой сегодня. После некоторых экспериментов кажется, что мы должны использовать com/domain/package/Outer$Inner. - person TsReaper; 20.12.2018

Да, есть один. Вы можете указать затронутые классы, которые вы хотите исключить при запуске JIT-компиляции:

-Xjit:exclude={package/class.method|package/class.method}
person soc    schedule 23.10.2010
comment
Я получаю Нераспознанный вариант: -Xjit:exclude={...} Не удалось создать виртуальную машину Java. - person Ralf; 23.10.2010
comment
Опции -X нестандартны. Они могут меняться между версиями и зависят от вашей JVM. - person robert_x44; 23.10.2010