我在VPS上有tomcat web应用程序,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
> RAM:2.5 gb,
>虚拟处理器:8
> HDD:60gb硬盘 – 70%免费
> Tomcat 7.0
> java -version:
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.
我的Web应用程序还运行6-7个线程,用于从不同的公共API收集数据.这些线程在tomcat启动时启动,并且它们始终以定期休眠运行.
你能告诉我它崩溃的原因吗?我怎么才能找到原因?
让我们解开这个:
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杀手……但是OOM杀手使用SIGKILL而不是SIGTERM. JVM永远不会看到SIGKILL的到来!
(您可以通过查看“/ var / log / messages”…或系统记录内核消息的任何地方来确认它不是OOM杀手.请参阅 How to Configure the Linux Out-of-Memory Killer )
如果它不是OOM杀手,那么有几种方法可以找到信号源:
> Finding the source of signals on Linux with strace, auditd, or systemtap
一旦你掌握了信号的来源,你就会有线索的原因.
另一个值得注意的事情是在处理SIGTERM时发生了OutOfMemoryError.这强烈暗示(对我而言)根本原因是某些东西检测到Tomcat使用了太多内存,并且发送了一个SIGTERM以使其消失(干净利落).我猜想当时发生的事情是JVM进入操作系统要求更多的内存(处理SIGTERM)并且操作系统显示“否”,并且JVM抛出OutOfMemoryError.不幸的是,JVM现在处于无法彻底退出或恢复的状态.因此它说“虚拟机可能需要被强行终止”.
无论如何.这看起来像是一个常见的Java问题的一个相当不寻常的表现.您很可能在Tomcat中运行的webapps中存在泄漏内存的错误.如果是这种情况,唯一真正的解决方案是找到并修复错误. (增加堆大小……如果可能的话……只会解决问题.它可能会减少崩溃之间的间隔,但不太可能阻止它们.)
假设你准备好咬紧牙关:
> How to find a Java Memory Leak
1 – 除非在本机代码中做某些事情……
翻译自:https://stackoverflow.com/questions/11095094/i-get-java-hotspottm-64-bit-server-vm-warning-exception-java-lang-outofmemor