Java服务进程异常消失退出排查思路

当Java服务进程每隔两分钟消失时,可能是由多种原因造成的,如系统资源限制、JVM崩溃、OOM或运维策略。通过检查内存快照、Linux日志和错误日志文件,可以定位问题源头。在本文案例中,问题源于健康检查配置错误,导致服务因未检测到预期端口而被误杀。解决方案是正确配置服务的健康检查端口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

测试环境出现的情况,Java服务隔两分钟左右进程就消失了,啥也没有留下

常规的排查思路

进程消失有以下几种情况:
1.系统杀掉进程
2.JVM奔溃(自身问题),应该是很少出现的
3.OOM导致的退出
4.一些运维策略,比如某项指标超过阈值后,kill掉该进程,或者是自动拉起(会kill掉原进程,然后重启)

按照最可能出现的情况一一排查:

OOM导致的退出

一般这种情况下,在Java启动参数上加上配置(当发生OOM时自动dump内存快照),然后下载内存快照,使用工具分析,很容易发现是哪里出了问题

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath={快照存贮路径}

如果你在对应的路径发现了内存快照,那么基本可以确定就是OOM导致的

Linux系统主动杀掉了进程

Linux系统在内存不足时,会主动去杀掉一些进程,OOM-Killer机制
默认配置下,日志文件保存在/var/log目录下,所以可以去该文件夹下搜索即可

fgrep -i -r 'killed process' /var/log

如果搜索出了Out of memory相关的日志,则基本可以确定是机器内存不足。

JVM自身奔溃

JVM自身故障导致进程没有时,会有一个hs_err_pid_xxx.log的文件生成,它包含了导致crash的重要信息,通过分析文件来查找crash原因。
该文件的目录,默认是在工作目录下,同样也可以通过Java启动参数来设置

-XX:ErrorFile=/var/log/hs_err_pid.log
公司的运维策略等,比如健康检查或者其他

大部分公司都会对服务做健康检查,比如检测某个端口是否开启等等,如果端口配置错误或者服务启动过慢或者其他一些原因,可能会触发自动拉起逻辑(kill掉该进程并且重启)
这种场景下,是无法找到相关的日志的。

我这边进程不断被杀的原因

原来是服务配置的健康检查导致的,由于服务同时开启http端口和dubbo端口,配置的是检测http的端口(所以进程每次都起了,但是检测不到端口)
原来是服务进行重构时,把http和rpc给剥离了,导致rpc的服务只起了dubbo端口,从而一直被自动拉起。

参考文档

哪些原因导致java进程退出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值