zoukankan      html  css  js  c++  java
  • 【原创】JAVA进程突然消失的原因?

    引言

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

    JVM进程消失可能有哪些原因?
    

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

    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来查看:

    dmesg | grep java
    

    输出如下

    [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日志。如果还没有,翻内核日志。
    如果上面还没有,请联系烟哥解决。

  • 相关阅读:
    关于mybatis中的#{},和${} 的区别
    免费的手机号码归属地查询API接口文档
    小程序即将上线,现在就可以开发啦
    (二)cordova+framework7入门——笑笑APP
    (一)半小时开发一个APP
    图灵机器人(问答机器人)API调用示例
    免费股票数据API接口
    CTO和技术副总裁应该如何分工?谁才是技术领导者?
    基于JAVA的全国天气预报接口调用示例
    PhpSms 稳定可靠的php短信发送库
  • 原文地址:https://www.cnblogs.com/rjzheng/p/11317889.html
Copyright © 2011-2022 走看看