首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止Spring / Tomcat (Java8)进程被OOM杀死?

问如何防止Spring / Tomcat (Java8)进程被OOM杀死?
EN

Stack Overflow用户
提问于 2018-07-13 17:57:29
回答 2查看 2K关注 0票数 0

自从迁移到Tomcat 8/Java8 8之后,Tomcat服务器不时被OOM杀死。OOM =由Linux内核造成的内存耗尽。

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

这会是内存泄漏的结果吗?我想我会收到一条正常的内存不足的信息,但没有OOM-杀手。对,是这样?

是否应该更改堆大小的设置?我应该更改MetaSpace大小的设置吗?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-29 15:07:17

另一个非常好的解决方案是将应用程序转换为Spring (Docker)应用程序。通常,这个应用程序的内存消耗要少得多。

因此,我们将逐步获得巨大的改进(如果您可以迁移到Spring应用程序):

  • 迁移到Spring应用程序。在我的例子中,这采取了三个简单的行动。
  • 使用重量轻的基本图像。见下文。
  • 非常重要的--使用内存平衡选项。请参阅下面Dockerfile的最后一行。这将我正在运行的容器RAM的使用量从650 my减少到仅为240 my。跑得很顺利。所以,在650 on上节省超过400 on的!

这是我的Dockerfile:

代码语言:javascript
复制
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"]
票数 1
EN

Stack Overflow用户

发布于 2018-07-15 18:17:09

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

堆应设置为最大大小(-Xmx),以小于服务器上的物理RAM。如果不是这样的话,那么在垃圾收集时,分页就会导致性能非常差。

如果它是由以无限制的方式生长的元空间所引起的,那么您需要找出发生这种情况的原因。只要设置metaspace的最大大小,一旦达到所设置的限制,就会导致外部内存错误。提高极限是没有意义的,因为最终你会达到你设定的任何更高的极限。

在崩溃之前运行应用程序和(当然不容易,但您需要判断它),杀死-3 tomcat进程。然后分析堆,试图找出为什么metaspace变大。它通常是由动态加载类引起的。这就是你的应用程序正在做的事情吗?更有可能的是,这是某种框架在做这件事。(Nb杀手会杀死-9 tomcat进程,之后您将无法诊断,因此您需要让应用程序运行并在此之前进行干预)。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51330545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档