除了OOM,还有什么可以杀死Linux上的Java进程?
我有两个虚拟服务器来托管我的web应用程序。它们完全相同,使用1.5GB内存运行Debian 6。我使用新安装的脚本配置OS和Tomcat,因此我知道它们是相同的 我的webapp在Tomcat中运行,我设置了850M堆和100M烫发大小。我的应用程序经常在其中一台服务器上死机。我的第一反应是检查是否有杀人凶手,但日志中没有这方面的证据 问题:除了OOM,还有什么可以杀死Linux上的Java进程?,java,linux,jvm,out-of-memory,Java,Linux,Jvm,Out Of Memory,我有两个虚拟服务器来托管我的web应用程序。它们完全相同,使用1.5GB内存运行Debian 6。我使用新安装的脚本配置OS和Tomcat,因此我知道它们是相同的 我的webapp在Tomcat中运行,我设置了850M堆和100M烫发大小。我的应用程序经常在其中一台服务器上死机。我的第一反应是检查是否有杀人凶手,但日志中没有这方面的证据 问题: OOM杀手是否可以在不留下相应日志消息的情况下杀死应用程序 [编辑]如果没有,并且考虑到我没有任何明显的证据会扼杀流程,我在哪里可以找到诊断问题的证据
- OOM杀手是否可以在不留下相应日志消息的情况下杀死应用程序
- [编辑]如果没有,并且考虑到我没有任何明显的证据会扼杀流程,我在哪里可以找到诊断问题的证据
谢谢,JVM终止的原因很多。它可以根据所属用户或root发送给它的信号终止,也可以根据信号终止(如您所述) 在一些情况下,我可以将随机崩溃追溯到坏/故障RAM,这会导致JVM内存损坏,最终导致进程以
SIGSEGV
终止。您可以查看是否有hs\u err\u pidXXXX.log
文件。如果运行进程的用户没有在目标目录中写入的权限,则可能会丢失这些文件。您可以使用-XX:ErrorFile=/path/to/file指定它们的位置。
根据个人经验,在偶发、无法追查、无法解释的随机崩溃情况下,我通常会做的第一件事是运行memtest86
几个小时。我倾向于在网络中有一个PXE可引导映像
编辑:鉴于您提到的是由另一家公司运营的虚拟专用服务器,在裸机上运行memtest86对您来说是不可能的,但也有一个用户空间版本值得尝试。如果您希望在OOM上杀死JVM(有时这是一个有效的用例),您可以使用以下选项启动JVM:
-XX:onAutofmemoryError=kill-9%p
任何运行的东西,只要是拥有该进程的用户或超级用户就可以杀死它。因此,问题不应该是“可以做什么”,而应该是“会做什么?”您确定该进程不会自行消亡/崩溃吗?这两台服务器是否使用相同的虚拟化技术?我记得OpenVZ的旧版本在java应用程序方面存在问题。好吧,即使是webApp中的System.exit(0)
也可以停止java进程。当然,如果出现问题,您将看到“适当的日志消息”,这也取决于记录器的配置和应用程序的异常处理。@ChrisStratton,Matthias-抱歉,我意识到原则上任何东西都可能扼杀进程。我将重新表述我的问题。。。我看不出有什么明显的杀伤力,它会这么做。我想我的问题应该是——鉴于我不知道为什么我的应用程序在一个vps上消亡,而不是在另一个vps上消亡,我在哪里可以找到杀死它的最好证据?@Nelson——它们都由budgetvm.com托管(尽管在不同的位置),我相信这项技术就是OpenVZ vps。这是对我一般问题的一个很好的回答。在我的具体案例中,我认为问题在于OpenVZ没有给我所需的内存,尽管我从未找到任何日志进行确认。