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%) 字节。内存在“看起来加载所有 JSP 会导致问题。
默认情况下,Tomcat 将所有已加载的 JSP 保存在内存中,直到 Web 应用程序停止。
在 Tomcat 7 中,您可以设置 JSP Servlet 的 maxLoadedJsps 参数来限制内存中保存的 JSP 的数量。
【讨论】:
谢谢,Tomcat 6 也有解决方案吗? 还没有。由于一些需要修复的错误和缺乏兴趣的组合,此功能的后向端口停滞不前。以上是关于JVM HeapDump:内存在“java.util.concurrent.ConcurrentHashMap$Segment”的一个实例中累积的主要内容,如果未能解决你的问题,请参考以下文章