首页 > 解决方案 > Tomcat JVM 中 ParallelWebAppClassLoaders 的多个实例保留对象的行为

问题描述

我正在努力识别运行 Spring MVC 应用程序的 Tomcat 8.5.38 服务器(Centos 7.6、openjdk 1.8、4 CPU)中重复的 OutOfMemory 问题。

这个问题是这个应用程序的新问题。(编辑:问题在 Tomcat 从 8.5.35 升级到 8.5.38 后开始)。我通过添加“-XX:+HeapDumpOnOutOfMemoryError”JVM 设置保存了内存堆转储。在堆转储中,我看到有 2 个 ParallelWebAppClassLoader 实例。此应用程序使用查找值的大型 HashMap(约 200 Mb)作为缓存。每个类加载器都有一个对此 HashMap 的单独引用。我试图找出为什么这个 JVM 中有 2 个 ParallelWebAppClassLoader 实例?server.xml 没有指定使用 ParallelWebAppClassLoader。

期望 ParallelWebAppClassLoader 维护 HashMap 的副本是否正确?

如果是同一个对象的2个副本,如果使用ParallelWebAppClassLoader,如何优化这个重复空间?

标签: memory-leaksjvmtomcat8heap-dumpcatalina

解决方案


问题是因为 Tomcat 从 8.5.35 升级到 8.5.35。在这次升级之后,JVM 有两个类加载器,因此占用了两倍的内存。可以通过增加 RAM 或将 Tomcat 版本回滚到 8.5.35 来快速修复。

如果有控制类加载器数量的设置,请发布答案。我会赞成的。


推荐阅读