![Tomcat 服务崩溃](https://linux22.com/image/629330/Tomcat%20%E6%9C%8D%E5%8A%A1%E5%B4%A9%E6%BA%83.png)
我遇到了 Tomcat 服务崩溃(停止响应请求)的问题,需要每隔几天进行 sigkill 并重新启动。我的图表显示,在高峰期,HEAP 内存使用量达到约 3gb,这是问题最明显的症状。据我所知,为 jvm 添加 Xmx 最大内存限制决定了可以分配多少 HEAP。Xmx 设置为超过 10gb。
我也尝试过 MaxPermSize 参数,但无济于事。我认为此设置定义了某些应用程序内存使用的内存分配,但据我所知,它与 HEAP 内存本身不同。
现在我想知道是否有可以传入的替代设置来定义 /实际/ HEAP 内存限制?否则,任何有关调查问题的提示都会很好,因为我不能肯定地说这是内存限制,而且错误日志没有显示太多内容。
答案1
我首先建议您参加 Java 和 Tomcat 速成课程。我可以为您提供各种提示,但最终您需要了解如何正确管理服务器。
也就是说,您无法告诉 JVM 它可以使用比您的机器可用的内存更多的内存。如果您的 Xmx 已经超过 10Gb,也许您可以增加它(如果您的服务器有更多可用 RAM)。但很有可能,在您之前设置它的人可能已经将其设置为最大可能性。
至于发生了什么,您的日志将告诉您内存不足的原因 - HEAP 或 PermGen。您需要了解它们各自的含义,您可以在此处阅读相关内容:Java HotSpot VM 选项。
但坦率地说,看起来您的应用程序中发生了内存泄漏 - 除非您以默认的 PermGen 值运行并且 PermGen 即将用完,此时它可能不是一个严重的问题,只需增加 PermGen 就可以了。
例如,PermGen 是运行时生成的代码驻留的地方。对于当今的框架,这很常见(Hibernate、Spring、AOP 等)。因此,典型设置是 512Mb 或 1Gb。根据我的经验,很少需要超过这个值,但这可能因应用程序而异。