Как включить компилятор Java HotSpot VM - PullRequest
0 голосов
/ 10 октября 2018

Я использую java 1.8.0_05, 64-разрядную серверную виртуальную машину Java HotSpot (TM). Я запускаю веб-приложение java на tomcat 8.0.43

. Недавно я развернул файл .war, удалив егов папке webapps.

Это привело к регистрации следующего сообщения:

Предупреждение о виртуальной машине 64-разрядного сервера Java HotSpot (TM): CodeCache переполнен.Компилятор был отключен.Предупреждение о виртуальной машине 64-разрядного сервера Java HotSpot (TM): попробуйте увеличить размер кэша кода с помощью -XX: ReservedCodeCacheSize = CodeCache: размер = 245760 КБ используется = 244058 КБ max_used = 244079 КБ бесплатно = 1701 КБ границ [...] total_blobs = 48344 nmethods = 47669adapters = 584: компиляция: отключена (недостаточно непрерывного свободного места)

Как проверить текущее состояние компилятора, чтобы убедиться, что он по-прежнему отключен?

Как я могу включить компилятор?Могу ли я просто перезапустить tomcat?

Кажется, нет заметных различий в том, как работает мое приложение (например, с точки зрения скорости).

Интересно, я не получилэто сообщение при развертывании одного и того же приложения на идентичном сервере.Вот почему я хотел бы сначала просто включить компилятор, а не изменять настройки (например, ReservedCodeCacheSize), как рекомендует сообщение.

Затем, если проблема не устраняется, я вижу, какие настройки мне нужно изменить.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Ответы на ваши индивидуальные вопросы + 1 рекомендация:

  • Как проверить, отключен ли JIT-компилятор?

Самый простой способДля этого нужно запустить jvisualvm (уже поставляется с JDK), а затем проверить используемое пространство кодового кэша .Если ваш CodeCache заполнен, JIT-компилятор останется отключенным.Чтобы проверить пространство памяти Code Cache:

  1. установите плагин MBeans JVisualVM.
  2. перейдите в Mbeans
  3. , откройте java.lang / MemoryPool / Code Cache
  4. проверьте переменную «Использование» (двойной щелчок)

Это даст вам общее представление о том, где вы находитесь.

  • Как включитькомпилятор?Могу ли я просто перезапустить tomcat?

Да, перезапуск, безусловно, сбросит состояние кэша. Единственный другой способ перезапустить ваш компилятор, если у вас естьуже запустил JVM с правильными параметрами.(включение UseCodeCacheFlushing)

  • Нет разницы в том, как работает мое приложение?

JIT оптимизирует ваш код, , но в зависимости отваше приложение и способ его использования, вы можете не заметить заметных различий .Предполагая, что вы запускаете веб-приложение (из-за Tomcat), скорость передачи по сети или отображение страниц в вашем браузере, вероятно, на несколько порядков ниже, чем то, что дает вам JIT с точки зрения скорости ядра Java.

  • «Я не получил это сообщение при развертывании того же приложения»

JIT-компиляция зависит от кода, который выполняется в данный момент. То же приложениеможет работать совсем иначе под капотом на уровне, где работает JIT.Когда речь идет о низкоуровневых функциях, чем больше сторонних библиотек вы используете, тем меньше вы можете быть уверены в том, что происходит во всех тех потоках, над которыми у вас нет контроля.

  • предложение:

Пожалуйста, обновите эту версию Java.Очень редко (u_05) быть на такой ранней версии JDK8, и это довольно опасно. Java8 не был самым стабильным выпуском, когда он выходил, и имел легко воспроизводимые ошибки даже в более поздних выпусках. В JDK8 исправлено более 1000 ошибок .Многие из них были непосредственно связаны с проблемами JIT.Если у вас есть контроль над средой, с которой вы разговариваете, обновите ее.Если вы этого не сделаете, сообщите об этом ответственному лицу.

0 голосов
/ 10 октября 2018

У меня была эта проблема некоторое время назад, и вот что я не могу вам сказать:

Как только кэш кода заполнится, компилятор автоматически отключится.

Будет ли он автоматическиперезапущен?

Нет.И он будет работать до перезапуска JVM.

Могу ли я просто перезапустить tomcat?

Да.Но, вероятно, это произойдет снова.

Кажется, что в работе моего приложения нет заметных отличий (например, с точки зрения скорости).

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

Что вы можете сделать?

  1. Вы можете увеличить бит -XX: ReservedCodeCacheSize
  2. Вы можете включить -XX: + UseCodeCacheFlushing.Недостатком является то, что если размер вашего CodeCache слишком мал и вы постоянно достигаете порога сброса, это повлияет на производительность, поскольку вы тратите ресурсы ЦП в процессе сброса.

Я бы увеличилустановите бит CodeCacheSize, включите сброс и наблюдайте за приложением с помощью VisualVM или чего-то такого, что позволяет вам просматривать текущее состояние CodeCache.Мониторинг поможет вам понять, достигаете ли вы пороговые значения время от времени или часто это происходит.

Помните, что CodeCache отделен от кучи, поэтому просмотр HeapSize вам не поможет.

Редактировать: Что касается VisualVM, вот официальные шаги для подключения к удаленной JVM:

https://docs.oracle.com/javase/8/docs/technotes/guides/visualvm/applications_remote.html

Просто убедитесь, что JMX включен, и он долженработать прямо сейчас.

Что касается проблемы со многими приложениями, работающими одновременно ... Ну да, технически Standard Tomcat запускает одну JVM для всех приложений.Кэш-память будет использоваться совместно.

Вы также можете отслеживать этот случай, подключив VisualVM к JVM, отменив развертывание приложения и проверив, освободилось ли пространство.

Вы также можете рассмотреть возможность использования Enterprise.контейнер, который позволит вам создать одну JVM для каждого приложения.

...