У меня была эта проблема некоторое время назад, и вот что я не могу вам сказать:
Как только кэш кода заполнится, компилятор автоматически отключится.
Будет ли он автоматическиперезапущен?
Нет.И он будет работать до перезапуска JVM.
Могу ли я просто перезапустить tomcat?
Да.Но, вероятно, это произойдет снова.
Кажется, что в работе моего приложения нет заметных отличий (например, с точки зрения скорости).
В долгосрочной перспективе возникнут некоторые проблемы, поскольку код, который можно кэшировать и оптимизировать, больше не может быть скомпилирован и сохранен там.
Что вы можете сделать?
- Вы можете увеличить бит -XX: ReservedCodeCacheSize
- Вы можете включить -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 для каждого приложения.