使用Groovy 2.4.4的简单Grails 2.5.1应用程序类加载器

使用Groovy 2.4.4的简单Grails 2.5.1应用程序类加载器,grails,groovy,memory-leaks,classloader,redeploy,Grails,Groovy,Memory Leaks,Classloader,Redeploy,我在Tomcat8中重新部署一个简单的Grails应用程序时遇到了问题 我的设置如下所示: Grails 2.5.1全新应用程序,刚用create app Tomcat 8.0.28(64位Linux二进制版本) Java 1.8.0_65-b17热点服务器虚拟机 Tomcat也是一个全新的安装,只修改了两件事(因为我想在生产中使用它们): server.xml context.xml 我已经重新启动了Tomcat服务器。根据JVisualVM,它加载了2398个类。复制grails

我在Tomcat8中重新部署一个简单的Grails应用程序时遇到了问题

我的设置如下所示:

  • Grails 2.5.1全新应用程序,刚用
    create app
  • Tomcat 8.0.28(64位Linux二进制版本)
  • Java 1.8.0_65-b17热点服务器虚拟机
Tomcat也是一个全新的安装,只修改了两件事(因为我想在生产中使用它们):

server.xml

context.xml

我已经重新启动了Tomcat服务器。根据JVisualVM,它加载了2398个类。复制grails prod war生成的war文件后,等待部署完成,加载了10022个类。在再次复制战争,从而引发重新部署后,它有16300个班级

在第一次部署和第二次部署之后,我进行了堆转储,并使用EclipseMat分析了类加载器,我可以看到有一个额外的
org.apache.catalina.loader.WebappClassLoader
,加载了6138个类(因此总共有两个类)

堆空间保持不变,只是元空间的使用率显著增加(与类的数量的增长率大致相同)

更新

使用MAT进行深入挖掘,我注意到总有9个实例使类加载器保持活动状态。它们是
org.codehaus.groovy.reflection.ClassInfo
(每个基本java类型包装器和
Void
)的实例。这些ClassInfo仅由
java.lang.ClassValue$Entry
引用,它扩展了
WeakReference
,因此我真的很困惑这些实例如何没有被垃圾收集

有没有人有过类似的问题?什么会导致此加载程序挂起?

此问题与

我不完全理解这个问题,但我将尝试简短地描述它:
使用
ClassValue
(由于JDK错误)可以防止对象被垃圾收集。Groovy 2.4.5中的提交暂时禁用了
ClassValue
的使用,而JDK错误得到修复

Grails2.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'
这个问题与

我不完全理解这个问题,但我将尝试简短地描述它:
使用
ClassValue
(由于JDK错误)可以防止对象被垃圾收集。Groovy 2.4.5中的提交暂时禁用了
ClassValue
的使用,而JDK错误得到修复

Grails2.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'

您可以手动部署类而不是war您可以手动部署类而不是war