我在 Tomcat 8 中热重新部署一个简单的 Grails 应用程序时遇到问题。
我的设置如下:
- Grails 2.5.1 全新的应用程序,刚刚创建
create-app
- Tomcat 8.0.28(64 位 Linux 二进制版本)
- Java 1.8.0_65-b17 HotSpot 服务器虚拟机
Tomcat也是全新安装的,只修改了两处(因为我想在生产中使用):
服务器.xml
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" undeployOldVersions="true">
上下文.xml
<Context antiResourceLocking="true">
我已经重新启动了 Tomcat 服务器。根据 JVisualVM,它加载了 2398 个类。复制由 生成的 war 文件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
extends引用WeakReference
,所以我真的很困惑这些实例如何没有被垃圾收集。
有没有人有类似的问题?什么可能导致这个装载机徘徊?