服务器jvm挂掉怎么排查,进程消失原因有哪些?

服务器上jvm挂了,最快的排查路径是:先确认进程状态和系统资源,再看jvm日志和操作系统日志,最后结合dump文件定位根因。这个过程听起来像侦探破案,但按顺序排查,往往能在几分钟内找到线索。

先分清到底是“真挂了”还是“假死了”

很多人一看到jvm没响应就慌,第一反应是重启,但重启只治标不治本,下次还得挂,动手之前,先花一分钟判断症状:

进程消失(真挂了)

  • 用ps -ef | grep java查看进程是否还在
  • 用top确认java进程的CPU和内存占用情况

进程还在但卡死(假死)

  • jstack命令可以打印线程快照,如果命令执行超时或直接报错,大概率是假死
  • 应用端口无法访问,但是ping能通,说明操作系统层面的网络是通的

业内专家指出,生产环境里jvm假死的出现频率比真正崩溃更高,因为jvm本身的设计非常健壮,除非是被kill -9或者操作系统层面内存不足触发了OOM Killer,否则很少直接消失。

jvm频繁full gc怎么排查这通常是假死的元凶

如果进程还在,但应用像睡着了一样,大方向先查垃圾回收,Full GC(全局垃圾回收)时jvm会暂停所有工作线程,如果full gc持续过长或过于频繁,应用就表现为假死。

(注:此小标签系统自动隐藏)

拿到GC日志先看两个数字

排查前先确认jvm启动参数里有没有打印GC日志,没有的话就是个盲盒状态,有条件的话,下次启动务必加上这些参数:

-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:/data/logs/gc.log

拿到日志后重点看两个指标:

服务器jvm挂掉怎么排查,进程消失原因有哪些?

  • GC频率:正常情况下,minor gc每秒几次或几秒一次,full gc一天几次或几天一次,如果full gc达到每分钟好几次,肯定是有问题的
  • GC停顿时间:单次full gc停顿超过1秒就要警惕,超过10秒基本等于应用不可用

堆内存里到底堆了什么

Full gc频繁的根源,大多是内存里的对象无法被回收,用下面命令抓一个堆内存快照:

jmap -dump:format=b,file=/data/logs/heap.hprof <pid>

然后打开MAT(Eclipse Memory Analyzer)或者VisualVM分析dump文件,优先看:

  • 哪个类的实例数量异常巨大
  • 哪个对象占据了最多的堆内存
  • 对象之间的引用链,看看是谁在“持有”它们

常见的元凶是缓存、静态集合、数据库连接没关闭、线程池队列堆积,举个例子,把数据全部加载到静态HashMap里当缓存用,数据量上来后,堆内存很容易被打满。

linux服务器jvm内存溢出问题定位从操作系统日志逆推

有时候进程直接消失,根本来不及抓dump文件,这时候操作系统日志就是第一破案现场。

dmesg和系统日志是破案关键

执行命令:

dmesg | grep -i oom

如果输出了类似Out of memory: Kill process 12345 (java),说明是操作系统把jvm给杀了,这通常发生在物理机或容器内存被全部耗尽时。

再看一下系统日志:

cat /var/log/messages | grep -i java

如果是云服务器,一般可以在控制台查看系统日志,这一条路径能快速确认两个问题:内存到底有没有耗尽,是谁耗尽了内存。

容器场景下的特殊坑

很多团队把java应用跑在docker容器里,这里有个常见的坑:

服务器jvm挂掉怎么排查,进程消失原因有哪些?

jvm默认读取的是宿主机的内存大小,而不是容器的内存限制,老版本jvm可能直接申请超过容器限额的内存,导致被强制杀掉。

排查时看两个值:

  • 容器的内存限制:docker inspect <container_id> | grep Memory
  • jvm最大堆设置:jinfo -flag MaxHeapSize <pid>

如果容器限制了2GB,但jvm最大堆竟然设了4GB,那被杀掉只是时间问题。

处理jvm异常退出不能只靠重启

搞清楚了原因,但不能每次都手动重启,线上应用需要具备自动恢复的能力,建议做三件事:

  • 配置-XX:+ExitOnOutOfMemoryError,让应用在OOM时快速退出,然后由supervisor、systemd或k8s自动拉起
  • 将jvm启动参数中的GC日志和堆内存配置写入启动脚本,避免人工遗漏
  • 设置操作系统层面的监控告警,内存指标达到阈值时提前触发通知,而不是等挂了再处理

systemd守护的配置示例

[Service]
ExecStart=/usr/bin/java -Xms2g -Xmx2g -XX:+ExitOnOutOfMemoryError -jar app.jar
Restart=always
RestartSec=10

这样可以保证jvm异常退出后,10秒内自动重启,减少业务中断时间。

从日志到源码,一步步缩小范围

有些问题从jvm本身找不到根因,比如频繁full gc和线程卡顿是由业务代码引起的,这种情况下还需要继续往下排查。

线程堆积是最容易忽视的异常信号

执行jstack <pid> > thread.txt,然后重点检查:

  • 大量线程处于BLOCKED状态,说明锁竞争严重
  • 大量线程处于WAITING状态,说明线程池配置不适配业务场景
  • 服务器jvm挂掉怎么排查,进程消失原因有哪些?

    自定义线程池的队列长度异常增长

常见的一个案例:线程池核心线程数设置太小,任务队列无限增长,导致线程处理的都是老任务,新任务排队时间越来越长,用户感觉系统挂了,但jvm确实还在运行。

连接池满了也会引发假死现象

数据库连接池满了,线程会一直等待获取连接,表现就是所有请求超时,排查方法:

netstat -an | grep 3306 | wc -l

统计数据库连接数是否超过了连接池上限,如果连接数异常偏高,同时show processlist能看到大量sleep状态的连接,基本可以断定连接池泄露。

这种情况下检查代码里所有获取连接的逻辑,确保finally块里正确释放连接,或者改用try-with-resources语法。

Q&A

进程还在但CPU跑满,是jvm挂了吗?

不一定是jvm挂了,可能是有线程在做密集计算或死循环,用top -H -p <pid>找出CPU占用最高的线程,再用jstack匹配线程id查看对应的业务代码,这种方式定位CPU问题非常高效。

jvm的堆外内存能排查吗?

可以,但相对麻烦,堆外内存(包括直接内存、元空间等)溢出时,jvm本身不会报OOM异常,而是进程被操作系统直接杀掉,排查时结合dmesg和/var/log/messages里的内存信息,同时使用-XX:MaxDirectMemorySize参数限制直接内存大小,排查这类问题一般需要结合glibc的内存分配机制,难度较高。

jvm崩溃日志去哪里找?

jvm发生致命错误时会在启动目录生成类似hs_err_pid.log的文件,里面有崩溃时的线程状态、内存使用情况、原生线程栈等内容,这个文件对于定位linux服务器上jvm崩溃类问题非常关键。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/article/768552.html

赞 (0)
T350服务器多少钱一台,2026年最新报价是多少?
上一篇 2026年10月20日 15:05
负载均衡常用的工具有哪些?负载均衡软件哪个好用
下一篇 2026年3月31日 13:09

相关推荐

  • 如何解决IIS安装配置服务器失败,服务器配置错误修复方法

    安装IIS时提示“配置服务器失败”并不可怕,直接用管理员权限的DISM命令就能绕过这个报错,把IIS成功装上,出现这个提示,通常是Windows功能安装流程在配置阶段卡住了,常见诱因包括旧版本的IIS残留、依赖组件缺失,或者安装权限不够,安装iis提示配置服务器失败原因排查不少朋友在Windows Server……

    2026年10月5日
    000
  • ai人工智能客服机器人好用吗?智能客服系统怎么选

    在数字化转型的浪潮中,企业客户服务的核心竞争力和运营效率直接决定了品牌的市场地位,部署智能化的客服系统已不再是企业的“可选项”,而是提升客户满意度、降低运营成本的“必选项”, 通过引入先进的自动化技术,企业能够实现7×24小时的无缝响应,将客户服务从传统的成本中心转化为价值中心,这不仅是技术升级的体现,更是服务……

    2026年3月5日
    10700
  • 服务商提供配套存储产品价格对比如何?哪家最便宜?

    在对比服务商配套存储产品价格时,不能只看表面单价,更要关注资质、性能与长期成本,选对持牌服务商才能避免后期数据迁移或合规风险,存储产品价格对比,核心维度有哪些多数人第一反应是看每GB单价,但实际使用中总成本包含多个层面,存储产品价格对比要覆盖以下要素:存储容量单价:高性能SSD与普通HDD差异明显,冷热数据分层……

    2026年7月25日
    400
  • 戴尔双cpu服务器内存条怎么插,正确方法是什么

    直接给出答案戴尔双CPU服务器插内存条的核心口诀是“先看机箱内指示,每个CPU至少插满一个通道,内存条数量尽量对称”——具体第一条内存应插在CPU对应的A1或B1插槽,顺序由近到远,颜色相同的插槽优先插满, 如果不按这个顺序插,轻则内存不识别,重则服务器反复重启甚至报警不停,戴尔双CPU服务器内存插法核心规则戴……

    2026年10月12日
    100
  • aix查看端口正在使用,aix如何查看端口占用情况

    在AIX操作系统运维过程中,精准掌握端口占用情况是保障业务稳定运行的核心技能,核心结论是:在AIX环境下查看端口正在使用的情况,最专业且高效的方案是组合使用netstat命令与rmsock命令,通过端口号反向追踪进程ID(PID),从而实现精准管控, 相比Linux系统,AIX的端口管理机制具有独特性,直接使用……

    2026年3月17日
    13900
  • ASP.NET如何添加水印?完整教程与实现步骤

    ASP.NET水印核心技术解析与实战方案在ASP.NET应用中实施水印的核心价值在于:通过技术手段在敏感文档、图像或界面元素上嵌入可追溯的标识信息,有效降低数据泄露风险达67%(IBM Security 2023),同时强化版权声明与品牌展示,是平衡数据安全与业务需求的必备技术策略,水印的核心价值与业务场景水印……

    2026年2月10日
    13760
  • 如何设置ASP.NET网页图标?掌握这几种方式轻松搞定

    在ASP.NET应用中正确显示网页图标(Favicon)是提升品牌识别度和用户体验的关键细节,以下是几种高效且可靠的方式,涵盖传统方法及现代最佳实践: 经典方式:根目录放置 favicon.ico原理: 绝大多数浏览器会自动请求网站根目录下的 favicon.ico 文件,这是最广泛支持、兼容性最好的方法(包括……

    2026年2月11日
    17000
  • 服务器与安卓客户端如何通信,安卓socket通信怎么实现?

    服务器与安卓客户端通信的核心在于根据业务场景选择合适的协议和架构,对于大多数应用而言,HTTP/HTTPS配合RESTful API是基础方案,而WebSocket和MQTT则用于实时性要求高的场景,合理优化通信性能能显著提升用户体验,安卓客户端与服务器通信的几种主流协议对比在开发安卓应用时,通信协议的选择是首……

    2026年7月22日
    1400
  • DNF连不上服务器怎么办,游戏登录失败原因有哪些?

    DNF链接不上服务器通常是因为网络波动、客户端文件损坏或服务器维护,你可以通过检查网络连接、修复游戏文件或重启路由器来解决,DNF连接不上服务器?先排查网络问题网络连接是DNF登录失败的第一大原因,大多数情况都出在本地网络环境上,下面从最基础的步骤开始,逐步定位问题,检查本地网络连接状态先确认电脑是否能正常上网……

    2026年8月8日
    2900
  • 大规模数据导出打满网卡影响查询吗,如何避免数据导出影响查询

    大规模数据导出任务之所以容易打满网卡并拖垮在线查询,根本原因在于导出过程占满了网络出口带宽,导致查询请求的数据包在队列里干等;解决方案就是给导出任务做限速、分流或走旁路快照,让在线查询永远有路可走,最近不少运维朋友跟我聊到一个共性难题:半夜跑一个几千万行的表导出,第二天一看监控,网卡流量直接打满,在线业务查询延……

    2026年9月10日
    300

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注