自从迁移到 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/