【原创】JAVA进程忽然消失的缘由?

引言

值此七夕佳节,烟哥放弃了无数妹纸的邀约,坐在电脑面前码字,就是为了给读者带来新的知识,这是一件伟大的事业!
好吧,实际状况是没人约。为了化解尴尬,我决定卖力写文章,嗯,必定是我过于屌丝!
好了,开始说重点。今天讲的这个问题java

JVM进程消失可能有哪些缘由?

这个问题也是面试中常常出现的,以下图所示
linux

ps:因为两年多没写crud了,因此忘记mybatis怎么用了,因此上面那个问题,我选择了无视。面试

那咱们就开一篇文章说一下这个问题,其实很easy的,无外乎三种状况。缓存

  • linux的OOM killer杀死
  • JVM自身故障
  • jvm的OOM致使进程退出(很罕见,我至今没碰见过)

引言

linux的OOM killer

Linux 内核有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤为是瞬间很快消耗大量内存的进程,为了防止内存耗尽而内核会把该进程杀掉。
所以,你发现java进程忽然没了,首先要怀疑是否是被linux的OOM killer给干掉了!
你能够去下面这个文件里翻安全

  • 系统报错日志:/var/log/messages

你执行命令服务器

egrep -i 'killed process' /var/log/messages

去日志里进行查询。
固然,你也能够去内核日志里头查询。有时Linux系统或者系统上运行的java或者其它进程,会发生一些莫名其妙的问题,好比忽然挂掉了,好比忽然重启等等。在软件上找不到问题所在,此时咱们应该怀疑硬件或者内核的问题,此时咱们就可使用 dmesg来查看:mybatis

dmesg | grep java

输出以下jvm

[5673702.665338] Out of memory: Kill process 29953 (java) score 431 or sacrifice child
[5673702.665338] Killed process 29953, UID 500, (java) total-vm:9805316kB, anon-rss:2344496kB, file-rss:128kB

彻底是能够看到内核对进程作对操做。工具

JVM自身故障

当JVM发生致命错误致使崩溃时,会生成一个hs_err_pid_xxx.log这样的文件,该文件包含了致使 JVM crash 的重要信息,咱们能够经过分析该文件定位到致使 JVM Crash 的缘由,从而修复保证系统稳定。
默认状况下,该文件是生成在工做目录下的,固然也能够经过 JVM 参数指定生成路径:线程

-XX:ErrorFile=/var/log/hs_err_pid<pid>.log

这个文件的内容他主要有以下内容

  • 日志头文件
  • 致使 crash 的线程信息
  • 全部线程信息
  • 安全点和锁信息
  • 堆信息
  • 本地代码缓存
  • 编译事件
  • gc 相关记录
  • jvm 内存映射
  • jvm 启动参数
  • 服务器信息

拿到这个文件后,不用说了,慢慢啃吧。说到这里,我要摸着良心说。这个文件巨复杂,若是要会读这个文件,请下点功夫。

JVM的OOM

坦白说,我不多遇到由于JVM的OOM,致使java进程退出的状况。
由于,通常状况下,出现OOM异常,JVM的GC会进行回收,是不会致使JVM进程退出的。要真说惟一致使退出的状况,那就是内存泄漏,因为内存占用愈来愈大,结果。。。。
不过这种JVM的OOM致使的异常,很好排查。
由于,你注意两个个参数

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=*/java.hprof;

而后去找dump快照文件,接下来借助VisualVM这种可视化工具分析就行。很容易定位问题。

总结

综上所述,正确回答是。先翻dump文件,dump若是没有,翻hs_err_pid.log日志。若是尚未,翻内核日志。 若是上面尚未,请联系烟哥解决。

相关文章
相关标签/搜索