陈迅 發表於 2019-10-30 18:32:00

Linux服务器Java进程突然消失排查办法

<h1><span style="font-size: 15px">出处:<span style="color: rgba(51, 153, 102, 1)"><span style="color: rgba(51, 153, 102, 1)">JAVA进程突然消失的原因?</span></span></span></h1>
<h1>问题描述</h1>
<p>在实际生产环境下,如果我们遇见Java进程突然消失,该如何去排查问题?</p>
<h1>思路</h1>
<h3>可能有几种原因:</h3>
<h4>①、Java应用程序的问题:发生OOM导致进程Crash</h4>
<p>最常见的是发生堆内存异常“java.lang.OutOfMemoryError: Java heap space”,排查步骤如下:</p>
<ul>
<li>Step1: 查看JVM参数 -XX:+HeapDumpOnOutOfMemoryError 和 -XX:HeapDumpPath=*/java.hprof;</li>
<li>Step2: 根据HeapDumpPath指定的路径查看是否产生dump文件;</li>
<li>Step3: 若存在dump文件,使用Jhat、VisualVM等工具分析即可;</li>
</ul>
<h4>&nbsp;</h4>
<h4>②、JVM出错:JVM或JDK自身的Bug导致进程Crash</h4>
<p>  当JVM发生致命错误导致崩溃时,会生成一个hs_err_pid_xxx.log这样的文件,该文件包含了导致 JVM crash 的重要信息,我们可以通过分析该文件定位到导致 JVM Crash 的原因,从而修复保证系统稳定。<br>  默认情况下,该文件是生成在工作目录下的,当然也可以通过 JVM 参数指定生成路径:</p>
<div class="cnblogs_code">
<pre>-XX:ErrorFile=/var/log/hs_err_pid&lt;pid&gt;.log</pre>
</div>
<p>这个文件的内容他主要有如下内容</p>
<ul>
<li>日志头文件</li>
<li>导致 crash 的线程信息</li>
<li>所有线程信息</li>
<li>安全点和锁信息</li>
<li>堆信息</li>
<li>本地代码缓存</li>
<li>编译事件</li>
<li>gc 相关记录</li>
<li>jvm 内存映射</li>
<li>jvm 启动参数</li>
<li>服务器信息</li>
</ul>
<p>拿到这个文件后,不用说了,慢慢啃吧。说到这里,我要摸着良心说。这个文件巨复杂,如果要会读这个文件,请下点功夫。</p>
<h4>&nbsp;</h4>
<h4>③被操作系统OOM-Killer</h4>
<p>  Linux 内核有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽而内核会把该进程杀掉。<br>  因此,你发现java进程突然没了,首先要怀疑是不是被linux的OOM killer给干掉了!<br>  你可以去下面这个文件里翻</p>
<ul>
<ul>
<li>系统报错日志:<code>/var/log/messages</code></li>





</ul>




</ul>
<p>  你执行命令</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">egrep</span> -i <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">killed process</span><span style="color: rgba(128, 0, 0, 1)">'</span> /var/log/<span style="color: rgba(0, 0, 0, 1)">messages <br></span></pre>
<pre><span># <span style="color: rgba(255, 0, 0, 1)">egrep</span>&nbsp;=&nbsp;grep&nbsp;-E&nbsp;可以使用基本的正则表达外,&nbsp;还可以用扩展表达式,-i代表忽略大小写</span></pre>
<pre><span style="color: rgba(0, 0, 0, 1)">#或者
</span><span style="color: rgba(0, 0, 255, 1)">grep</span> “Out of memory” /var/log/messages</pre>
</div>
<p>去日志里进行查询。<br>  当然,你也可以去内核日志里头查询。有时Linux系统或者系统上运行的java或者其它进程,会发生一些莫名其妙的问题,比如突然挂掉了,比如突然重启等等。在软件上找不到问题所在,此时我们应该怀疑硬件或者内核的问题,此时我们就可以使用 dmesg来查看:</p>
<div class="cnblogs_code">
<pre>dmesg -T| <span style="color: rgba(0, 0, 255, 1)">grep</span><span style="color: rgba(0, 0, 0, 1)"> java
#或者
dmesg </span>-T | <span style="color: rgba(0, 0, 255, 1)">grep</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Out of memory</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
# </span>-T 是显示时间戳</pre>
</div>
<p><img src="https://img2018.cnblogs.com/blog/885859/201910/885859-20191030182531240-2115415395.png" alt=""></p>
<p>&nbsp;再对比java日志停止时间,看来这里才是问题的根源,所以接下来从优化java内存占用、加内存入手尝试解决问题吧!</p>
<p>&nbsp;</p>
<p>备注:</p>
<p>  dmesg命令是用来在Unix-like系统中显示内核的相关信息的。dmesg全称是display message (or display driver),即显示信息。</p>
<p>  实际上,dmesg命令是从内核环形缓冲区中获取数据的。当我们在Linux上排除故障时,dmesg命令会十分方便,它能很好地帮我们鉴别硬件相关的error和warning。除此之外,dmesg命令还能打印出守护进程相关的信息,已帮助我们debug。</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/myseries/p/11766804.html
頁: [1]
查看完整版本: Linux服务器Java进程突然消失排查办法