Linux服务器Java进程消失问题解决

  

这篇文章主要介绍了Linux服务器Java进程消失问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

  

<强>问题描述
  

  

在实际生产环境下,如果我们遇见Java进程突然消失,该如何去排查问题?

  

<>强思路
  

  

可能有几种原因:
  

  

①, Java应用程序的问题:发生伯父导致进程事故
  最常见的是发生堆内存异常" . lang。OutOfMemoryError: Java堆空间”,排查步骤如下:

  
      <李>步骤1:查看JVM参数- xx: + HeapDumpOnOutOfMemoryError和- xx: HeapDumpPath=*/java.hprof;李   <李>步骤2:根据HeapDumpPath指定的路径查看是否产生转储文件;李   <李>步骤3:若存在转储文件,使用Jhat, VisualVM等工具分析即可,李   
  

②, JVM出错:JVM或JDK自身的错误导致进程事故
  

  

当JVM发生致命错误导致崩溃时,会生成一个hs_err_pid_xxx。日志这样的文件,该文件包含了导致JVM崩溃的重要信息,我们可以通过分析该文件定位到导致JVM崩溃的原因,从而修复保证系统稳定。
  

  

默认情况下,该文件是生成在工作目录下的,当然也可以通过JVM参数指定生成路径:

  

- xx: ErrorFile=/var/log/hs_err_pid。日志
  这个文件的内容他主要有如下内容

  
      <李>日志头文件   <李>导致崩溃的线程信息李   <李>所有线程信息李   <李>安全点和锁信息李   <李>堆信息李   <李>本地代码缓存李   <李>编译事件   <李> gc相关记录   <李> jvm内存映射李   <李> jvm启动参数   <李>服务器信息李   
  

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

  

③被操作系统OOM-Killer
  

  

Linux内核有个机制叫伯父杀手(内存不足杀手),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽而内核会把该进程杀掉。
  

  

因此,你发现java进程突然没了,首先要怀疑是不是被linux的伯父杀手给干掉了!
  

  

你可以去下面这个文件里翻

  

系统报错日志:/var/log/消息
  

  

你执行命令

        egrep我/var/log/messages死亡过程   # egrep=grep - e可以使用基本的正则表达外,还可以用扩展表达式,我代表忽略大小写   #或者   grep“内存溢出”/var/log/messages      

去日志里进行查询。
  

  

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

        dmesg命令- t | grep java   #或者   dmesg命令- t | grep“内存不足”   # - t是显示时间戳      

癓inux服务器Java进程消失问题解决"

  

再对比java日志停止时间,看来这里才是问题的根源,所以接下来从优化java内存占用,加内存入手尝试解决问题吧!

  

备注:

  

dmesg命令是用来在类unix系统中显示内核的相关信息的.dmesg全称是显示消息(或显示驱动),即显示信息。

  

实际上,dmesg命令是从内核环形缓冲区中获取数据的。当我们在Linux上排除故障时,dmesg命令命令会十分方便,它能很好地帮我们鉴别硬件相关的错误和警告。除此之外,dmesg命令命令还能打印出守护进程相关的信息,已帮助我们调试。

Linux服务器Java进程消失问题解决