JAVA进程突然消失问题解决方案
作者:孤独烟 发布时间:2023-12-24 04:38:43
引言
JVM进程消失可能有哪些原因?
这个问题也是面试中经常出现的,如下图所示
ps:由于两年多没写crud了,所以忘记mybatis怎么用了,所以上面那个问题,我选择了无视。
那我们就开一篇文章说一下这个问题,其实很easy的,无外乎三种情况。
linux的OOM killer杀死
JVM自身故障
jvm的OOM导致进程退出(很罕见,我至今没遇见过)
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日志。如果还没有,翻内核日志。
如果上面还没有,请联系烟哥解决。
来源:https://www.cnblogs.com/rjzheng/p/11317889.html
猜你喜欢
- 本文将是JVM 性能优化系列的第二篇文章(第一篇:传送门),Java 编译器将是本文讨论的核心内容。本文中,作者(Eva Andreasso
- 本文实例讲述了java实现文件重命名的方法。分享给大家供大家参考。具体如下:下载的电影总是有一些存在网站名称等没用的信息 作为一个强迫症患者
- 编码问题,有两种方式可以解决,一是在您的程序中直接使用setlocale函数设置Windows的编码方式为中文(好像中文的值是.936);s
- 做项目的时候需要对拿到的数据进行“清洗”,比如剔除一些不可能存在的身份证号码。查阅了网上的身份证号码验证算法,自己也总结一下。(一)18身份
- 内存对齐的基本原则:结构(struct/class)的内置类型数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的起始位置
- 一、前言:TCP原理简介首先,保证文章完整性,TCP的理论原理还是需要简介一下,略显枯燥๑乛◡乛๑。TCP(传输控制协议,Transmiss
- 一、Maven项目使用步骤一般包含两步,1)引入依赖 2)特定的 IDE 引入对应的插件1)在POM中引入依赖<!-- https:/
- java实现字符串匹配暴力匹配/** * 暴力匹配 * * @param str1 需要找的总字符串 * @param str2 需要找到的
- 前言在机器学习中,卷积神经网络是一种深度前馈人工神经网络,已成功地应用于图像识别。目前,很多的车牌识号识别,人脸识别等都采用卷积神经网络,可
- 一、背景日常开发中,有时候需要根据某个 key 加锁,确保多线程情况下,对该 key 的加锁和解锁之间的代码串行执行。大家可以借助每个 ke
- 一直到大四才开始写自己的第一篇博客,说来实在有点羞愧。今天写了关于排序的算法题,有插入排序,冒泡排序,选择排序,以下贴上用JAVA实现的代码
- 1、对属性进行封装,使用户不能直接输入数据,我们需要避免用户再使用"对象.属性"的方式对属性进行赋值。则需要将属性声明为
- 只是为了研究下idea这款编译器怎么使用。开门见山,说下如何配置这款编译器,不配置也能用,但是强迫症表示不服。下面直入正题:下载与安装就不说
- java中Executor,ExecutorService,ThreadPoolExecutor详解1.Excutor  
- 本文分为俩部分:第一部分介绍如何给Eclipse安装Spring Boot开发插件spring tool suite(简称STS);第二部分
- 1.try-catch异常处理说明Java提供try和catch块来处理异常,try块用于包含可能出错的代码。catch块用于处理try块中
- 1、private实现封装处理如果像想要知道封装,首先必须清楚如果没有封装会怎么样?没有封装方法中的属性,在所有方法被调用后都可以进行无权限
- Java常用类包装类由于Java语言中的基本类型不是面向对象,并不具备对象的性质,实际使用存在很多不便。Java在java.lang包中提供
- 本篇将从以下几个方面讲述反射的知识:class 的使用方法的反射构造函数的反射成员变量的反射一、什么是class类在面向对象的世界里,万物皆
- 本文实例讲述了Java Lambda表达式。分享给大家供大家参考,具体如下:一 点睛Lambda表达式支持将代码块作为方法参数,Lambda