网站首页 > java教程 正文
点关注,不迷路;持续更新Java相关技术及资讯!!!
个人技术公众号:Java耕耘者
JVM进程消失可能有哪些原因?
这个问题也是面试中经常出现的,如下图所示
由于两年多没写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日志。如果还没有,翻内核日志。如果还没有...应该不会吧~~~
为了感谢支持我的朋友!整理了一份Java高级架构资料、Spring源码分析、Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式等资料关注私信回复:555领取
本文到这里就结束了,喜欢的朋友可以帮忙转发和关注一下,感谢支持!
个人技术公众号:【Java耕耘者】 欢迎关注~~~
作者:孤独烟 出处: http://rjzheng.cnblogs.com/
猜你喜欢
- 2024-10-01 详解linux查看磁盘读写信息--blockdump、blktrace、systemtap
- 2024-10-01 java项目部署linux常用指令(java如何部署项目)
- 2024-10-01 进程间通信(进程间通信的三种基本方法)
- 2024-10-01 Linux 入门必看:如何60秒内分析Linux性能
- 2024-10-01 Linux排查java进程占用CPU过高原因方法
- 2024-10-01 干货:Linux启动Java程序jar包Shell脚本
- 2024-10-01 Linux下java进程CPU占用率高-分析方法
- 2024-10-01 17种查看Linux物理内存的方法(linux如何查看物理内存)
- 2024-10-01 Java通过shell脚本监控重启服务(java shell脚本)
- 2024-10-01 每天进步一点点之linux 查看内存及进程的方法
你 发表评论:
欢迎- 最近发表
-
- 五,网络安全IDA Pro反汇编工具初识及逆向工程解密实战
- 「JAVA8」- Lambda 表达式(java lambda表达式原理)
- 深入探讨Java代码保护:虚拟机保护技术的新时代
- Nginx反向代理原理详解(图文全面总结)
- 逆向拆解日本IT,哪些Java技术栈薪资溢价高
- mybatis 逆向工程使用姿势不对,把表清空了,心里慌的一比
- Spring Boot集成ProGuard轻松实现Java 代码混淆, Java 应用固若金汤
- 从 Java 代码逆向工程生成 UML 类图和序列图
- 人与人相处:尊重是标配,靠谱是高配,厚道是顶配
- Windows系统安装日期如何修改(windows10怎么修改安装日期)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)