Приложение 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'
Другие вопросы по тегам