Приложение Simple Grails 2.5.1 пропускает загрузчики классов с помощью Groovy 2.4.4
У меня проблемы с горячим повторным развертыванием простого приложения Grails в Tomcat 8.
Моя установка следующая:
- Grails 2.5.1 Новое приложение, только что созданное с
create-app
- Tomcat 8.0.28 (64-разрядная бинарная версия Linux)
- Java 1.8.0_65-b17 Виртуальный сервер HotSpot
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 классов.
Я сделал дампы кучи после первого развертывания, и во-вторых, и анализируя загрузчики классов с помощью Eclipse MAT, я вижу, что есть один дополнительный org.apache.catalina.loader.WebappClassLoader
с 6 138 загруженными классами (всего их два).
Пространство кучи оставалось довольно постоянным, значительно увеличилось только использование MetaSpace (примерно с той же скоростью, что и количество классов).
Обновить
Используя MAT, чтобы копать глубже, я заметил, что всегда есть 9 экземпляров, которые поддерживают загрузчик классов. Они являются примерами org.codehaus.groovy.reflection.ClassInfo
(один для каждой примитивной оболочки типа Java и Void
). На эти ClassInfos ссылаются только java.lang.ClassValue$Entry
, который расширяет WeakReference
Я действительно озадачен тем, как эти экземпляры не собирают мусор.
У кого-нибудь были подобные проблемы? Что может заставить этот загрузчик зависать?
1 ответ
Эта проблема связана с https://issues.apache.org/jira/browse/GROOVY-7591
Я не до конца понимаю проблему, но постараюсь кратко ее описать:
Использование ClassValue
(из-за ошибки JDK) предотвращает сбор мусора для объектов. А коммит в Groovy 2.4.5 временно отключил использование ClassValue
в то время как ошибка JDK исправлена.
Grails 2.5.1 использует Groovy 2.4.4 по умолчанию, поэтому для решения проблемы я заменил его в BuildConfig.groovy
и перестроить приложение.
build 'org.codehaus.groovy:groovy-all:2.4.5'
compile 'org.codehaus.groovy:groovy-all:2.4.5'