java - 我在 tomcat 中收到 "Java HotSpot(TM) 64-Bit Server VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGTERM to handler"错误

标签 java tomcat7 out-of-memory jvm-crash

我在 VPS 上安装了 tomcat 网络应用程序,而 tomcat 有时(大约每月一次)崩溃并在 catalina.out 中出现以下错误:

Java HotSpot(TM) 64-Bit Server VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGTERM to handler- the VM may need to be forcibly terminated.

以下是有关我的配置的一些详细信息:

  • VPS:debian-5.0-x86_64

  • 内存:2.5GB,

  • 虚拟处理器:8

  • 硬盘:60gb 硬盘 - 70% 免费

  • Tomcat 7.0

  • java 版本:

    java version "1.6.0_18"
    OpenJDK Runtime Environment (IcedTea6 1.8.13) (6b18-1.8.13-0+squeeze1)
    OpenJDK 64-Bit Server VM (build 14.0-b16, mixed mode)
    
  • Java 参数:-Xms512m -Xmx1024m

我在那台服务器上也有 Apache-PHP。

我正在使用 Munin 监控服务器负载,它显示内存和 CPU 使用率始终稳定,并且在崩溃前没有任何增加。

我还通过 java.lang.Runtime 类记录 java 内存使用情况,它表明 jvm 始终使用 max200Mb 内存,并且在崩溃前没有增加。崩溃前的最后一条日志是 40 秒前,当时使用的内存是:152Mb。

我的网络应用程序还运行 6-7 个线程,从不同的公共(public) API 收集数据。这些线程在 tomcat 启动时启动,并且它们始终以周期性 sleep 的方式运行。

你能告诉我它为什么崩溃吗?我怎样才能找到原因?

最佳答案

让我们取消选择:

Exception java.lang.OutOfMemoryError occurred dispatching signal SIGTERM to handler- the VM may need to be forcibly terminated.

首先,它看起来像是向 JVM (Tomcat) 进程发送了一个 SIGTERM 信号。它必须是 JVM 外部的东西。 JVM 不会向自身发送信号1

所以你需要弄清楚是什么在做那件事。我的第一个猜测是 OOM killer ……但 OOM killer 使用的是 SIGKILL 而不是 SIGTERM。而且 JVM 永远不会看到 SIGKILL 的到来!

(您可以通过查看“/var/log/messages”或您的系统记录内核消息的任何位置来确认它不是 OOM killer 。参见 How to Configure the Linux Out-of-Memory Killer)

如果不是 OOM killer ,那么有几种方法可以找到信号源:

一旦知道了信号的来源,您就会知道发送信号的原因。


另一件值得注意的事情是 OutOfMemoryError 在处理 SIGTERM 时发生。这强烈表明(对我来说)根本原因是某些东西检测到 Tomcat 使用了太多内存,并向它发送了一个 SIGTERM 以使其消失(干净地)。我推测接下来发生的事情是 JVM 向操作系统请求更多内存(以处理 SIGTERM),而操作系统说“否”,然后 JVM 抛出 OutOfMemoryError。不幸的是,JVM 现在处于无法完全退出或恢复的状态。因此它说“可能需要强制终止 VM”。


无论如何。在我看来,这像是一个常见 Java 问题的一种相当不寻常的表现形式。您的 Tomcat 中运行的 Web 应用程序很可能存在内存泄漏错误。如果是这种情况,唯一真正的解决方案是找到并修复错误。 (增加堆大小......如果可能......只会推迟问题。它可能会减少崩溃之间的间隔,但不太可能阻止它们。)

假设您已准备好咬紧牙关:


1 - 除非某些东西在 native 代码中做了一些疯狂的事情......

关于java - 我在 tomcat 中收到 "Java HotSpot(TM) 64-Bit Server VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGTERM to handler"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11095094/

相关文章:

java - 从 Eclipse 中调试 Maven 程序集

java - 请求被拒绝,因为其大小超出了配置的最大值

java - Tomcat7 CentOS 服务启动失败

java - 读取 Jetty 请求正文会导致 IndexOutOfBoundsException

android - 内存不足位图解码文件 - Android

java - 并发实践 - volatile++

java - 如何将不属于 BindingProvider 子类的对象显式转换为 BindingProvider 对象?

java - 如何以数组形式检索 JTable 数据

c# - OutofMemoryException - 加载非常大的图像

.net - 加载大量小图像时出现 OutOfMemory 异常