Tomcat 8 (jvisualvm) 下的奇怪内存行为

Posted

技术标签:

【中文标题】Tomcat 8 (jvisualvm) 下的奇怪内存行为【英文标题】:Weird memory behavior under Tomcat 8 (jvisualvm) 【发布时间】:2014-08-20 22:11:09 【问题描述】:

我正在 Windows 8.1 上测试 Tomcat 8.0.3 和 Java 8(构建 1.8.0-b129 64 位服务器 VM(构建 25.0-b69,混合模式)上的 java webapp。

只需单击几下鼠标,应用程序就会耗尽内存。众所周知,它可以在带有 Tomcat 7 的 Windows 7 和带有 4GB RAM 的 Java 8(open jdk)的 CentOS 上运行良好。

30/06 23:42:56 错误 (error.ErrorController) org.springframework.web.util.NestedServletException: 处理程序处理失败;嵌套异常是 java.lang.OutOfMemoryError: PermGen space

警告 [RMI TCP Connection(11)-192.168.56.1] ServerCommunicatorAdmin.reqIncoming 服务器已决定关闭此客户端连接。

该应用程序还使用本地 ElasticSearch(不确定是否与它有关)。

您能否解释一下堆不断增长而实际内存使用量似乎下降的原因是什么?

【问题讨论】:

如果看不到完整的日志文件,说起来很复杂。我会开始关闭弹性搜索并模拟搜索。能不能在内存消耗大增的那一分钟贴上日志。 日志并没有真正的可疑之处——请求、响应+休眠SQL。我将尝试在所有内容上使用 DEBUG 运行它。 我现在无法真正复制它,将关闭问题。谢谢! 【参考方案1】:

这里的关键是“PermGen 空间”。该空间用于加载 .class 文件。也许你的类路径上有太多 jar/其他库,或者你的标准 permgen 大小不够。

这里很好地描述了如何为 Tomcat 设置自定义 permGen 空间:

How do I properly set the permgen size?

【讨论】:

感谢您的评论,我发现我实际上使用的是 Java 7,而不是我想的 8 - 因为 Java 8 不再有永久空间。我将重新进行更多测试并通知您。 他使用了 java 7 并提到 java 8 没有 permgen ......你的答案是重复的亲爱的大卫......谢谢你的错误投票......

以上是关于Tomcat 8 (jvisualvm) 下的奇怪内存行为的主要内容,如果未能解决你的问题,请参考以下文章

jvisualvm连接远程Tomcat

jvisualvm 监控 tomcat 实例

监控jvisualvm之jmx远程连接 tomcat war启动应用

jvisualVM远程连接JVM

tomcat监控

JAVA 利用 jmc或jvisualvm 监控 本地或者远程JVM