2010-06-28 2 views
2

Имеются флаги, которые предоставляют информацию журнала о методах, которые были скомпилированы. Где информация о методах, которые не были скомпилированы и почему они не были скомпилированы? Будучи способным понять, как компилятор Hotspot принимает свои решения и почему он не компилирует определенные методы, я бы лучше понял JVM и позвольте мне написать лучший код и, возможно, оптимизировать некоторые из моих методов. У кого-нибудь есть мысли по этому поводу?причина для методов, не скомпилированных в Hotspot JVM

ответ

2

По: http://blog.headius.com/2009/01/my-favorite-hotspot-jvm-flags.html

-XX: + PrintCompilation печатает имя каждого метода Java Hotspot решает JIT компиляции. Список будет , как правило, сначала отображает кучу основных Java-методов , а затем превратит в методы в вашем приложении.

Мое личное убеждение, что это просто сосать много вашего времени. Если вы используете код с использованием передового опыта и здравого смысла, а затем, если производительность - это проблема, профиль. Вы должны все исправить.

0

Ответ заключается в том, что методы не могут быть скомпилированы, если они не были выполнены достаточно раз. Кэш собственного кода ограничен, поэтому компиляция каждого метода является контрпродуктивной; вы можете завершить несколько методов, которые были скомпилированы, но затем важные больше не вписываются в размер кеша.

точные цифры варьируются от выпуска к выпуску, но если вы запускаете Java с -XX:+PrintFlagsFinal, то вы увидите все настройки, которые вы можете настроить, в том числе Tier3CompileThreshold (который имеет значение 2000) Tier4CompileThreshold (который имеет значение 15000). Поэтому, если вы не вызываете свой метод более 2000 раз, он просто использует интерпретатор, чтобы пройти через него.

Если вы хотите выполнить профилирование в условиях JIT, вам необходимо выполнить значительное число циклов, вызывающих методы, чтобы увидеть преимущество, или использовать профилирующий жгут, такой как JMH, для правильного профилирования.