JVM HeapDump:内存在“java.util.concurrent.ConcurrentHashMap$Segment”的一个实例中累积

Posted

技术标签:

【中文标题】JVM HeapDump:内存在“java.util.concurrent.ConcurrentHashMap$Segment”的一个实例中累积【英文标题】:JVM HeapDump: The memory is accumulated in one instance of "java.util.concurrent.ConcurrentHashMap$Segment 【发布时间】:2012-05-13 06:35:30 【问题描述】:

JVM 堆有问题。

我们使用 Apache HTTP 服务器和 Apache Tomcat 应用服务器运营一个网站。

对 Apache HTTP 服务器的所有 *.jsp 请求都将被重定向到 Tomcat 服务器(协议:ajp)。

网站有10000多个jsp文件。

我们还有一个谷歌搜索工具,它每晚都会抓取网站。

当它爬行时,jvm 堆空间上升到 8 GB 的最大限制。

使用 javamelody,我可以看到堆空间增加类似于加载的类。

为了分析,我做了一个堆转储。

这是来自 eclipse MAT 的报告:


“org.apache.catalina.loader.StandardClassLoader @ 0x7092c5148”加载的“org.apache.jasper.servlet.JspServlet”实例占用1'189'603'328(96.75%)字节。

内存在“”加载的“java.util.concurrent.ConcurrentHashMap$Segment[]”的一个实例中累积。

关键词

java.util.concurrent.ConcurrentHashMap$Segment[]

org.apache.catalina.loader.StandardClassLoader @ 0x7092c5148

org.apache.jasper.servlet.JspServlet


GSA 请求是否存在问题?

为什么JVM不能卸载生成的类?

【问题讨论】:

这显示使用了 1.1GB 的堆。这是唯一消耗内存的主要部分吗? 是的,只有它一个。我手动停止了 GSA 以进行堆转储,因此它不是很大的原因。我上周也拿了一个,然后是 3.8 GB。 我不会阻止 GSA 进行堆转储。如果你这样做,一些资源可能会被释放,然后你的堆转储不会告诉你整个故事。您是否在日志中看到内存不足异常?如果是这样,您可能需要添加启动参数 HeapDumpOnOutOfMemoryError ***.com/q/542979/425406 这是 OutOfMemoryError 后的堆转储:“org.apache.catalina.loader.StandardClassLoader @ 0x7092af928”加载的“org.apache.jasper.compiler.JspRuntimeContext”实例占用 4'367 '316'712 (98.57%) 字节。内存在“”加载的“java.util.concurrent.ConcurrentHashMap$Segment[]”的一个实例中累积。关键字 java.util.concurrent.ConcurrentHashMap$Segment[] org.apache.catalina.loader.StandardClassLoader @ 0x7092af928 org.apache.jasper.compiler.JspRuntimeContext 如果您还没有阅读此文档,请阅读此文档tomcat.apache.org/tomcat-6.0-doc/jasper-howto.html 这将帮助您调整您的 jasper 引擎,以减少由此造成的占用空间 【参考方案1】:

看起来加载所有 JSP 会导致问题。

默认情况下,Tomcat 将所有已加载的 JSP 保存在内存中,直到 Web 应用程序停止。

在 Tomcat 7 中,您可以设置 JSP Servlet 的 maxLoadedJsps 参数来限制内存中保存的 JSP 的数量。

【讨论】:

谢谢,Tomcat 6 也有解决方案吗? 还没有。由于一些需要修复的错误和缺乏兴趣的组合,此功能的后向端口停滞不前。

以上是关于JVM HeapDump:内存在“java.util.concurrent.ConcurrentHashMap$Segment”的一个实例中累积的主要内容,如果未能解决你的问题,请参考以下文章

HeapDump性能社区OOM问题排查实战案例精选合集

Spring Actuator信息泄露HeapDump

如何生成WAS的heapdump文件

JVM命令和工具

生产环境-jvm内存溢出-jprofile问题排查

获取JVM堆内存转储的常用方法