java - java -XX:OnError 用于验尸?
问题描述
我有一个在 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 不能解决问题。
解决方案
所以我可以想到很多可能性。
JVM 出现恐慌/崩溃。如果发生这种情况,则应在某处创建崩溃文件。所以......等到它再次发生。(我不确定在这种情况下是否会调用 OnError 处理程序。)
应用程序本身导致 JVM 退出;例如通过调用
System.exit(...)
某处。如果是这种情况,那么您不应该获得崩溃文件并且(我认为) OnError 处理程序将不会运行。应用程序外部的东西正在杀死它。如果它是一个
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_\*
推荐阅读
- three.js - Safari - THREE.WebGLProgram:着色器错误:错误:不支持的着色器版本 1:#version 300 es
- reactjs - material-ui 使用具有差异值的自动完成,选项类型
- sql - 滞后函数和 SUM
- r - 如何使用 facet 调整 ggplot 以在每个绘图视图中仅显示一个或两个变量
- java - Junit 5 @MockBean 中的 NullPointerException
- python - Pandas - 将每个可重复类的 ID 分组并将它们放在列中的列表中
- django - Django 数据表加载时间过长
- css - 在 ionic 5 中,Scss 文件未编译为 css 文件
- python - pandas: assign value based on equivalent value in another row with lookup
- python - PyVISA 和 PyMeasure 的问题 - 如何解决?