有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何防止Spring Boot/Tomcat(Java8)进程被OOMkilled?

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

如何防止Tomcat服务器被杀死

这可能是内存泄漏的结果吗?我想我会收到一条正常的内存不足信息,但不会被删除。对吗

我应该更改堆大小的设置吗? 我应该更改元空间大小的设置吗

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


共 (1) 个答案

  1. # 1 楼答案

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

    堆应设置为最大大小(-Xmx),以小于服务器上的物理RAM。如果不止这些,那么在垃圾收集时,分页将导致极低的性能

    如果它是由元空间无限增长引起的,那么你需要找出为什么会发生这种情况。只要设置元空间的最大大小,一旦达到设置的限制,就会导致outofmemory错误。提高限制是毫无意义的,因为最终你会达到你设定的任何更高的限制

    运行你的应用程序,在它崩溃之前(当然不容易,但你需要判断),杀死tomcat进程。然后分析堆,试图找出元空间变得越来越大的原因。这通常是由动态加载类引起的。这是你的应用程序正在做的事情吗?更有可能的是,某个框架正在这样做。(注意,oom killer将杀死tomcat进程-9,之后您将无法进行诊断,因此您需要让应用程序运行并在发生这种情况之前进行干预)

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