记一次Java进程突然消失问题

简介: 记一次Java进程突然消失问题@Date 2017.05.22现象: 线上同一个应用部署了多台服务器,有的机器运行过程中突然告警,发现服务进程消失.

记一次Java进程突然消失问题

@Date 2017.05.22

现象: 线上同一个应用部署了多台服务器,有的机器运行过程中突然告警,发现服务进程消失.

  • 看程序本身的日志,没有异常输出
  • 查询磁盘空间是否不足,没有此问题
  • 增加如下启动参数,查看GC日志,发现程序无GC出现
   -Xloggc:/home/admin/logs/gc.log 
   -XX:+PrintGCDetails 
   -XX:+PrintGCDateStamps 
   -XX:+HeapDumpOnOutOfMemoryError 
   -XX:HeapDumpPath=/home/admin/logs/java.hprof 
  • 在上述重启服务时,发现一个现象,程序重启没有多久就消失掉. 此时使用dmesg
    查看Linux系统日志, dmesg只能查看到最近的系统缓存日志,所以在现场能还原时查看最合适.

重点:

  • 会发现dmesg的日志中出现oom kill的字样,由此可以判断应该是机器内存被占满,系统自动选择一个占用内存最大的进行kill掉
  • 复现确认
    1. 在启动应用之后,使用free命令查看机器内存占用情况, 发现total和used相差无几
    2. 查看JVM启动参数以及机器内存配置,发现-Xmx配置和机器内存相等,由此可以断定是应用启动堆内存沾满机器内存,造成系统KILL

解决: 修改JVM启动参数,最好改成系统内存大小的1/2或者2/3左右即可

总结: 需要区分heap与 non-heap,堆内存不足会有OOM异常,进程无缘无故消失一般就是堆外内存导致

注意: 引起系统OOM-KILL的其他情况还有比如使用VIM编辑大文件, 如果文件过大也会造成撑满机器内存

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
3月前
|
监控 算法 Java
【JavaEE】什么是多线程?进程和线程的区别是什么?如何使用Java实现多线程?
【JavaEE】什么是多线程?进程和线程的区别是什么?如何使用Java实现多线程?
|
4月前
|
安全 Java API
深入了解Java进程和线程
深入了解Java进程和线程
53 1
|
3月前
|
消息中间件 设计模式 Java
Java Review - Java进程内部的消息中间件_Event Bus设计模式
Java Review - Java进程内部的消息中间件_Event Bus设计模式
59 0
|
2天前
|
Java API 调度
[Java并发基础]多进程编程
[Java并发基础]多进程编程
|
18天前
|
监控 Java Linux
linux下监控java进程 实现自动重启服务
linux下监控java进程 实现自动重启服务
|
3月前
|
Java
Java中的进程与线程
Java中的进程与线程
32 0
|
3月前
|
安全 Java API
深入了解Java进程和线程
深入了解Java进程和线程
40 1
|
3月前
|
Java 程序员 调度
JAVA 并发编程 进程、线程、协程
程序是静态的,程序运行后变为一个进程,一个进程内部可以有多个线程同时执行。进程是所有线程的集合,每一个线程是进程中的一条执行路径
|
4月前
|
Java Linux 微服务
linux中一键杀死springclud等各个java进程
linux中一键杀死springclud等各个java进程
|
4月前
|
Java API 调度
Java多线程基础(线程与进程的区别,线程的创建方式及常用api,线程的状态)
Java多线程基础(线程与进程的区别,线程的创建方式及常用api,线程的状态)
55 0
Java多线程基础(线程与进程的区别,线程的创建方式及常用api,线程的状态)