У меня есть проблемы с горячей передислокацией простого приложения Grails в Tomcat 8.Простой Grails 2.5.1 Утечки приложений загрузчиков классов с Groovy 2.4.4
Моей установка заключается в следующем:
- Grails 2.5.1 новое приложение, только что созданный с
create-app
- Tomcat 8.0.28 (64 бит Linux бинарная версия)
- Java 1.8.0_65-b17 HotSpot сервер VM
Tomcat также новая установка бренд, только модифицирована две вещи (как я хочу, чтобы использовать их в производстве):
server.xml
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" undeployOldVersions="true">
context.xml
<Context antiResourceLocking="true">
Я перезапустил сервер Tomcat. Согласно JVisualVM, он загрузил 2398 классов. После копирования файла войны, созданного grails prod war
, и ожидая завершения развертывания, в нем было загружено 10 022 классов. После повторного копирования войны, вызвав повторное развертывание, у него было 16 300 классов.
Объем кучи оставался довольно постоянным, только использование MetaSpace значительно увеличилось (примерно с той же скоростью, что и количество классов).
Update
Использование ТЗР копать глубже, я заметил, что всегда есть 9 случаев, хранящие загрузчик классов жив. Они являются примерами org.codehaus.groovy.reflection.ClassInfo
(по одному для каждой примитивной оболочки типа Java и Void
). Эти ClassInfos ссылаются только на java.lang.ClassValue$Entry
, который расширяет WeakReference
, поэтому я действительно озадачен тем, как эти экземпляры не собирают мусор.
У кого-нибудь были подобные проблемы? Что может заставить этот загрузчик повесить?
Вы можете развернуть свои классы вручную вместо войны – Ghayel