定位JAVA进程被kill的原因

摘要:
哪些原因可能会导致JAVA进程被kill呢?Java应用程序的问题:发生OOM导致进程CrashJVM自身故障:JVM或JDK自身的Bug导致进程Crash被操作系统OOM-Killer该如何去排查问题呢?一般情况下,出现OOM异常,JVM的GC会进行回收,是不会直接导致JVM进程退出的。不过这种JVM的OOM导致的异常,很好排查。当JVM出现致命错误时,会生成一个hs_err_pid_xxx.log这样的文件,该文件包含了导致jvmcrash的重要信息,可以通过分析该文件定位到导致crash的根源,从而改善以保证系统稳定。

哪些原因可能会导致JAVA进程被kill呢?

  • Java应用程序的问题:发生OOM导致进程Crash
  • JVM自身故障:JVM或JDK自身的Bug导致进程Crash
  • 被操作系统OOM-Killer

该如何去排查问题呢?

  • Java应用程序的问题:发生OOM导致进程Crash

这种情况主要取决于研发代码质量,我遇到过的大概有2次。一般情况下,出现OOM异常,JVM的GC会进行回收,是不会直接导致JVM进程退出的。如果出现退出的情况,那就是内存泄漏,由于内存占用越来越大,结果。。。。不过这种JVM的OOM导致的异常,很好排查。排查步骤如下:

Step1: 查看JVM参数 -XX:+HeapDumpOnOutOfMemoryError 和 -XX:HeapDumpPath=*/java.hprof
Step2: 根据HeapDumpPath指定的路径查看是否产生dump文件;
Step3: 若存在dump文件,使用VisualVM这种可视化工具分析就行等工具分析即可;
  • JVM自身故障:JVM或JDK自身的Bug导致进程Crash
    这种情况遇到一次,是因为JDK自身BUG导致的。当JVM出现致命错误时,会生成一个hs_err_pid_xxx.log这样的文件,该文件包含了导致jvm crash的重要信息,可以通过分析该文件定位到导致crash的根源,从而改善以保证系统稳定。当出现crash时,该文件默认会生成到工作目录下,然而可以通过jvm参数-XX:ErrorFile指定生成路径,eg:
    -XX:ErrorFile=/var/log/hs_err_pid<pid>.log
    然后根据错误信息,可以进入Java BUG dataBase库中去查找对应的BUG:
    https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8134389

  • 被操作系统OOM-Killer
    这种情况也遇到过一次。Linux 内核有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽而内核会把该进程杀掉。可以去/var/log/messages里翻系统报错日志,执行如下命令:

[root@vmt124-m5 /]# egrep -i 'killed process' /var/log/messages
Dec 29 00:39:41 localhost kernel: Killed process 26790, UID 0, (java) total-vm:9263796kB, anon-rss:4578020kB, file-rss:20kB

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

[root@vmt124-m5 /]# dmesg | grep java
java invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0, oom_score_adj=0
java cpuset=/ mems_allowed=0
Pid: 25475, comm: java Not tainted 2.6.32-220.el6.x86_64 #1
[31952]     0 31952  2338119   469643   2       0             0 java
[ 2435]  5025  2435   830476    11657   0       0             0 java
[26790]     0 26790  2315949  1144510   1       0             0 java
Out of memory: Kill process 26790 (java) score 560 or sacrifice child
Killed process 26790, UID 0, (java) total-vm:9263796kB, anon-rss:4578020kB, file-rss:20kB

完全是可以看到内核对进程做对操作。

总结

  对以上异常出现排查的排查顺序一般是:Java应用程序的问题 -> JVM自身故障 -> 被操作系统OOM-Killer。

作者:Root_123
链接:https://www.jianshu.com/p/0d2e4f393ded
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

免责声明:文章转载自《定位JAVA进程被kill的原因》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇将多个jar包重新打包成一个jar包.NET新手系列(一)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JVM调优之经验

在生产系统中,高吞吐和低延迟一直都是JVM调优的最终目标,但这两者恰恰又是相悖的,鱼和熊掌不可兼得,所以在调优之前要清楚舍谁而取谁。一般计算任务和组件服务会偏向高吞吐,而web展示则偏向低延迟才会带来更好的用户体验。 本文从性能和经验上来分享一下JVM参数的设置。 调优之前可以先用-XX:+PrintFlagsFinal来查看虚拟机是否默认开启某参数,不同...

Java 9 揭秘(19. 平台和JVM日志)

Tips做一个终身学习的人。 在这章中,主要介绍以下内容: 新的平台日志(logging)API JVM日志的命令行选项 JDK 9已经对平台类(JDK类)和JVM组件的日志系统进行了大整。 有一个新的API可以指定所选择的日志框架作为从平台类记录消息的日志后端。 还有一个新的命令行选项,可以从所有JVM组件访问消息。 在本章中,详细介绍两个记录工具...

JVM启动参数详解 (转)

非标准参数 非标准参数又称为扩展参数,其列表如下:-Xint设置jvm以解释模式运行,所有的字节码将被直接执行,而不会编译成本地码。-Xbatch关闭后台代码编译,强制在前台编译,编译完成之后才能进行代码执行;默认情况下,jvm在后台进行编译,若没有编译完成,则前台运行代码时以解释模式运行。-Xbootclasspath:bootclasspath让jv...

Java引用总结--StrongReference、SoftReference、WeakReference、PhantomReference

Java引用总结--StrongReference、SoftReference、WeakReference、PhantomReference   1 Java引用介绍   Java从1.2版本开始引入了4种引用,这4种引用的级别由高到低依次为:    强引用  >  软引用  >  弱引用  >  虚引用 ⑴强引用(StrongRefe...

公司线上虚拟机大量GC导致STW和CPU飙升--抽丝剥茧定位的过程

作者: bryan31 原链接:https://www.v2ex.com/t/701513 背景 公司线上有个 tomcat 服务,里面合并部署了大概 8 个微服务,之所以没有像其他微服务那样单独部署,其目的是为了节约服务器资源,况且这 8 个服务是属于边缘服务,并发不高,就算宕机也不会影响核心业务。 因为并发不高,所以线上一共部署了 2 个 tomcat...

ubuntu 安装jdk7总结

ubuntu 安装jdk7,现在来总结一下: 第一步:下载jdk-7u25-linux-x64.tar.gz 直接在ORACLE的官网中下载就可以: http://download.oracle.com/otn-pub/java/jdk/7u25-b15/jdk-7u25-linux-x64.tar.gz?AuthParam=13724178...