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

 更新时间:2019年11月27日 14:48:07   作者:myseries  
这篇文章主要介绍了Linux服务器Java进程消失问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

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

问题描述

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

思路

可能有几种原因:

①、Java应用程序的问题:发生OOM导致进程Crash
最常见的是发生堆内存异常“java.lang.OutOfMemoryError: Java heap space”,排查步骤如下:

  • Step1: 查看JVM参数 -XX:+HeapDumpOnOutOfMemoryError 和 -XX:HeapDumpPath=*/java.hprof;
  • Step2: 根据HeapDumpPath指定的路径查看是否产生dump文件;
  • Step3: 若存在dump文件,使用Jhat、VisualVM等工具分析即可;

②、JVM出错:JVM或JDK自身的Bug导致进程Crash

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

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

-XX:ErrorFile=/var/log/hs_err_pid<pid>.log
这个文件的内容他主要有如下内容

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

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

③被操作系统OOM-Killer

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

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

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

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

你执行命令

egrep -i 'killed process' /var/log/messages 
# egrep = grep -E 可以使用基本的正则表达外, 还可以用扩展表达式, -i代表忽略大小写 
#或者
grep “Out of memory” /var/log/messages

去日志里进行查询。

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

dmesg -T| grep java
#或者
dmesg -T | grep 'Out of memory'
# -T 是显示时间戳

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

备注:

dmesg命令是用来在Unix-like系统中显示内核的相关信息的。dmesg全称是display message (or display driver),即显示信息。

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

相关文章

  • Mybatis collection查询集合属性报错的解决方案

    Mybatis collection查询集合属性报错的解决方案

    这篇文章主要介绍了Mybatis collection查询集合属性报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • java中Map如何根据key的大小进行排序详解

    java中Map如何根据key的大小进行排序详解

    这篇文章主要给大家介绍了关于java中Map如何根据key的大小进行排序的相关资料,有时候我们业务上需要对map里面的值按照key的大小来进行排序的时候我们就可以利用如下方法来进行排序了,需要的朋友可以参考下
    2023-09-09
  • spring中BeanUtils.copyProperties的使用(深拷贝,浅拷贝)

    spring中BeanUtils.copyProperties的使用(深拷贝,浅拷贝)

    本文主要介绍了spring中BeanUtils.copyProperties的使用(深拷贝,浅拷贝),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Java读写txt文件时防止中文乱码问题出现的方法介绍

    Java读写txt文件时防止中文乱码问题出现的方法介绍

    这篇文章主要介绍了Java读写txt文件时防止中文乱码问题出现的方法,同时需要注意系统默认的文本保存编码的设置,需要的朋友可以参考下
    2015-12-12
  • token工作机制及原理附Java生成token工具类

    token工作机制及原理附Java生成token工具类

    这篇文章介绍了token工作机制及原理,内附Java生成token工具类Demo。对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • MyBatis-Plus 快速入门案例(小白教程)

    MyBatis-Plus 快速入门案例(小白教程)

    这篇文章主要介绍了MyBatis-Plus 快速入门案例(小白教程),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 手把手带你了解Java-Stream流方法学习及总结

    手把手带你了解Java-Stream流方法学习及总结

    这篇文章主要介绍了通过实例了解JavaStream流的方法学习和总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-08-08
  • Spring Boot 整合 JWT的方法

    Spring Boot 整合 JWT的方法

    这篇文章主要介绍了Spring Boot 整合 JWT的方法,文中实例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • CompletableFuture创建及功能使用全面详解

    CompletableFuture创建及功能使用全面详解

    这篇文章主要为大家介绍了CompletableFuture创建及功能使用全面详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • MyBatis实现MySQL批量插入的示例代码

    MyBatis实现MySQL批量插入的示例代码

    本文主要介绍了MyBatis实现MySQL批量插入的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05

最新评论