自从迁移到Tomcat 8/Java8 8之后,Tomcat服务器不时被OOM杀死。OOM =由Linux内核造成的内存耗尽。
如何防止Tomcat服务器被OOM杀死?
这会是内存泄漏的结果吗?我想我会收到一条正常的内存不足的信息,但没有OOM-杀手。对,是这样?
是否应该更改堆大小的设置?我应该更改MetaSpace大小的设置吗?
知道哪个Tomcat进程被杀死了,如何检索信息以便我可以重新配置Tomcat服务器?
发布于 2018-08-29 15:07:17
另一个非常好的解决方案是将应用程序转换为Spring (Docker)应用程序。通常,这个应用程序的内存消耗要少得多。
因此,我们将逐步获得巨大的改进(如果您可以迁移到Spring应用程序):
这是我的Dockerfile:
FROM openjdk:8-jdk-alpine
ENV JAVA_APP_JAR your.jar
ENV AB_OFF true
EXPOSE 8080
ADD target/$JAVA_APP_JAR /deployments/
CMD ["java","-XX:+UnlockExperimentalVMOptions", "-XX:+UseCGroupMemoryLimitForHeap", "-jar","/deployments/your.jar"]发布于 2018-07-15 18:17:09
首先,检查系统中的其他进程没有触发oomkill,或者服务器没有被其他进程重载。当其他贪婪的过程成为罪魁祸首时,Tomcat可能被oomkill不公平地作为目标。
堆应设置为最大大小(-Xmx),以小于服务器上的物理RAM。如果不是这样的话,那么在垃圾收集时,分页就会导致性能非常差。
如果它是由以无限制的方式生长的元空间所引起的,那么您需要找出发生这种情况的原因。只要设置metaspace的最大大小,一旦达到所设置的限制,就会导致外部内存错误。提高极限是没有意义的,因为最终你会达到你设定的任何更高的极限。
在崩溃之前运行应用程序和(当然不容易,但您需要判断它),杀死-3 tomcat进程。然后分析堆,试图找出为什么metaspace变大。它通常是由动态加载类引起的。这就是你的应用程序正在做的事情吗?更有可能的是,这是某种框架在做这件事。(Nb杀手会杀死-9 tomcat进程,之后您将无法诊断,因此您需要让应用程序运行并在此之前进行干预)。
还请查看这个问题--有一个有趣的答案,它声称对XML绑定设置进行了一个模糊的修复,解决了这个问题(非常可疑,但可能值得一试) java8 "java.lang.OutOfMemoryError: Metaspace"
https://stackoverflow.com/questions/51330545
复制相似问题