java - 如何防止 Spring Boot/Tomcat (Java8) 进程被 OOM 杀死?

标签 java linux tomcat

自从迁移到 Tomcat8/Java8 后,Tomcat 服务器有时会被 OOM 杀死。 OOM = 内存不足,被 Linux 内核终止。

如何防止Tomcat服务器被OOM杀死?

这可能是内存泄漏的结果吗?我想我会收到一条正常的内存不足消息,但没有 OOM-kill。正确的?

我应该更改 HEAP 大小的设置吗? 我应该更改 MetaSpace 大小的设置吗?

知道哪个 Tomcat 进程被终止,如何检索信息以便我可以重新配置 Tomcat 服务器?

最佳答案

首先检查 oomkill 没有被系统中的另一个进程触发,或者服务器没有被其他进程重载。可能是 Tomcat 被 oomkill 不公平地作为目标,而其他一些贪婪的进程是罪魁祸首。

应将堆设置为最大大小 (-Xmx),使其小于服务器上的物理 RAM。如果超过这个值,那么分页将导致垃圾收集时性能极差。

如果它是由无限增长的元空间引起的,那么您需要找出发生这种情况的原因。一旦达到您设置的限制,简单地设置元空间的最大大小将导致内存不足错误。提高限制将毫无意义,因为最终您会达到您设置的任何更高限制。

运行您的应用程序,它崩溃之前(当然不容易,但您需要判断它),kill -3 tomcat 进程。然后分析堆并尝试找出元空间变大的原因。它通常是由动态加载类引起的。这是您的应用程序正在做的事情吗?更有可能的是,这是一些框架在做这件事。 (nb oom killer 会 kill -9 tomcat 进程,之后你将无法诊断,所以你需要让应用程序运行并在此之前进行干预)。

另请查看这个问题 - 有一个有趣的答案声称对 XML 绑定(bind)设置的模糊修复解决了问题(非常可疑但可能值得一试)java8 "java.lang.OutOfMemoryError: Metaspace"

关于java - 如何防止 Spring Boot/Tomcat (Java8) 进程被 OOM 杀死?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51330545/

相关文章:

java - 可以为 Tomcat 7 使用自定义负载平衡策略吗?

java - 推土机和延迟初始化收集错误

linux - Ubuntu:15.04 -> 15.10 更新后重新启动 "Failed to talk to init daemon"

java - 我可以在 Java 的控制台输出中打印 cucumber 数据表吗?

在c和linux中计算程序执行时间

c - pthread_atfork() 被多次调用导致 after fork() 函数被多次调用

tomcat - 是否可以在 Tomcat 中组合 RemoteAddrValve 和身份验证阀?

java - 从 Netbeans 启动 Tomcat Web 应用程序时出现问题

java - Android billing v3 - 无签名

java - Spring Rest Controller,重写方法参数上的路径变量