问题的说明
在实际生产环境中,如果Java进程突然消失,该怎么办?
想法
可能有几个理由。
、Java APP应用问题:发生OOM导致的进程崩溃
最常见的是堆内存异常“Java.lang.out of memory error : javaheapspace”的发生,故障排除步骤如下。
step 1:查看JVM参数- xx : heapdumponoutofmemoryerror和- xx : heap dump path=*/Java.hprof;
确定是否基于step2:heapdumppath中指定的路径生成dump文件;
如果有step3:dump文件,可以使用Jhat、VisualVM等工具进行分析;
、JVM错误: JVM或JDK自身错误导致的进程Crash
如果JVM发生致命错误并发生崩溃,则会生成类似hs_err_pid_xxx.log的文件。 该文件包含引起JVM crash的重要信息,可以通过分析引起JVM crash的原因来保证系统的稳定性。
缺省情况下,文件在工作目录下生成。 当然,也可以使用JVM参数指定生成路径。
- xx : error file=/var/log/hs _ err _ PID.log
这份文件的内容他主要有以下内容
头文件
导致crash的线程信息
所有线程信息
安全点和锁定信息
堆信息
本地代码缓存
编译事件
gc相关记录
jvm内存映射
jvm启动参数
服务器信息
拿到这份文件后,当然,慢慢吃吧。 说到这里,我摸着良心说。 这个文件很复杂,所以为了能看懂这个文件,请下功夫。
被OOM-Killer
Linux内核有一种称为内存外钥(oom killer )的机制。 此机制监视内存消耗过多,特别是瞬间消耗大量内存的进程,内核会杀死该进程,以防止内存耗尽。
因此,如果发现java进程突然消失,请先怀疑是被linux的OOM killer杀死的。
你可以翻阅下一份文件
系统错误日志:/var/log/messages
你执行命令
egrep-I ' killed process '/var/log/messages
# egrep=grep-E除了基本正则表达式外,还可以使用扩展表达式,表示忽略大小写
#或grep“内存输出”/var/log/messages
我去查询日志。
当然,也可以查询内核日志。 在Linux系统或系统上运行的java和其他进程可能会出现令人费解的问题,例如突然锁定或突然重新启动。 如果在软件中未发现问题,则必须怀疑硬件或内核问题。 在这种情况下,可以使用dmesg验证以下内容:
dmesg-t
#或
内存丢失- t是显示时间戳
比较java日志的停止时间,这似乎是问题的根源,所以接下来我们优化java内存的使用量,从添加内存开始尝试解决问题。
评论:
dmesg命令用于在Unix-like系统上显示有关内核的信息。 dmesg的全名是显示消息(ordisplaydriver ),显示信息。
实际上,dmesg命令从内核的环形缓冲区检索数据。 在Linux上进行故障诊断时,dmesg命令非常有用,有助于识别与硬件相关的错误和警告。 此外,dmesg命令还可以打印有关守护进程的信息,从而为调试提供了帮助。