Доступны флаги, предоставляющие журнальную информацию о скомпилированных методах. Где информация о методах, которые не скомпилировались и почему они не скомпилировались? Возможность увидеть, как компилятор точки доступа принимает свои решения, и причины, по которым он не компилирует определенные методы, даст мне лучшее понимание JVM и позволит мне писать лучший код и, возможно, оптимизировать некоторые из моих методов. Есть у кого мысли на эту тему?
причина того, что методы не компилируются в Hotspot JVM
Ответы (2)
Согласно: http://blog.headius.com/2009/01/my-favorite-hotspot-jvm-flags.html
-XX:+PrintCompilation выводит имя каждого Java-метода, который Hotspot решает JIT-компилировать. Список обычно сначала показывает набор основных методов класса Java, а затем переходит к методам вашего приложения.
Мое личное убеждение в том, что это просто отнимет у вас много времени. Если вы кодируете, используя лучшие практики и здравый смысл, а затем, если производительность является проблемой, профилируйте. Вы должны сделать хорошо.
Ответ заключается в том, что методы не могут быть скомпилированы, если они не выполнялись достаточное количество раз. Кэш нативного кода ограничен, поэтому компиляция каждого метода контрпродуктивна; вы можете получить ряд методов, которые были скомпилированы, но тогда важные из них больше не помещаются в размер кеша.
Точные числа варьируются от версии к версии, но если вы запустите Java с -XX:+PrintFlagsFinal
, вы увидите все настройки, которые вы можете настроить, включая Tier3CompileThreshold
(имеет значение 2000) Tier4CompileThreshold
(имеет значение 15000). Поэтому, если вы не вызовете свой метод более 2000 раз, он просто будет использовать интерпретатор для его выполнения.
Если вы хотите выполнить профилирование в условиях JIT, вам нужно выполнить значительное количество циклов, вызывающих методы, чтобы увидеть преимущества, или использовать профилирующие средства, такие как JMH для правильного профилирования.