1

我有一个在 raspi 上运行的 java 工具。我 ssh 进入 raspi 并使用启动该工具

java -jar name.jar &

一段时间(几小时或几天)后,该过程不再运行。我的代码中有相当广泛的日志记录,但我的日志没有显示任何错误。所以问题是我如何分析情况?我想使用 -XX:OnError 方法,但最好指定什么?还有其他想法我能做什么吗?

更新:我找不到一个 hs_err_pid 文件。当我这样启动程序时,工作目录是什么?我已经扫描了启动 java 应用程序的目录,/var 和 /tmp 以及 /home/pi。

更新 2:工作目录显示为 /home/pi 没有 err pid 文件。我现在正在运行它

java -XX:OnError="/home/pi/Server/deah.sh" -XX:ErrorFile=/home/pi/Server/hs_err_pid%p.log -jar /home/pi/Server/myjavatool-0.1.2.jar &

如果正在创建错误文件,我可以“模拟”我看到的崩溃吗?杀 -9 不能解决问题。

4

1 回答 1

0

所以我可以想到很多可能性。

  1. JVM 出现恐慌/崩溃。如果发生这种情况,则应在某处创建崩溃文件。所以......等到它再次发生。(我不确定在这种情况下是否会调用 OnError 处理程序。)

  2. 应用程序本身导致 JVM 退出;例如通过调用System.exit(...)某处。如果是这种情况,那么您不应该获得崩溃文件并且(我认为) OnError 处理程序将不会运行。

  3. 应用程序外部的东西正在杀死它。如果它是一个SIG_KILL(-9) 信号,那么 JVM 将没有机会做任何事情。不会有故障转储,不会运行 OnError,应用程序日志中不会有任何内容,也不会运行 JVM 关闭挂钩。

    什么可能导致SIG_KILL?一种可能性是其他一些应用。第二种可能性是OOM杀手。这是(许多)基于 Linux 的系统的内置功能,它通过向SIG_KILL似乎是原因的进程发送 a 来对过多的虚拟内存分页活动做出反应。如果 OOM 杀手正在执行此操作,那么您应该会在系统日志文件中看到一个日志条目。

在这一点上,OOM 杀手似乎是最有可能的罪魁祸首。

更多信息:


如果正在创建错误文件,我可以“模拟”我看到的崩溃吗?杀 -9 不能解决问题。

我不这么认为。Akill -9发送一个SIG_KILL不能被目标进程捕获的。JVM 将没有机会生成崩溃文件。

如果要确定没有创建 err 文件,请使用find命令搜索整个文件系统;例如

 $ sudo find / -name hs_err_\*
于 2021-03-13T10:55:58.863 回答