memory-leaks - 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,如何优化这个重复空间?
解决方案
问题是因为 Tomcat 从 8.5.35 升级到 8.5.35。在这次升级之后,JVM 有两个类加载器,因此占用了两倍的内存。可以通过增加 RAM 或将 Tomcat 版本回滚到 8.5.35 来快速修复。
如果有控制类加载器数量的设置,请发布答案。我会赞成的。
推荐阅读
- c++ - 在 C++ 中创建对象的 3D 数据结构,如何正确初始化它
- python - 如果列表中有偶数,如何检查python
- sql-server - SQL Server 中的周数
- java - java - 如何在Java Map中存储多个键值对,因为“put()”会覆盖以前的数据
- html - 如何将一些容器彼此相邻放置?HTML/CSS
- python - 如何使用 Selenium 验证表格元素并单击其他元素
- android - 渐变不平滑
- alfresco - Alfresco Share:下载时缺少文件扩展名
- node.js - 术语“node.exe”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称
- python - 深入了解python中的数组函数