当前位置: 首页 > news >正文

线上服务器内存飙升到90%排查方法

这是一个典型的 Java 线上内存问题,可以按「应急止血 → 定位根因 → 长期根治」三个阶段来处理。下面给你一套可直接用于生产环境的标准排查流程


一、应急止血(先保系统)

目标:不让服务继续恶化,争取排查时间

1️⃣ 快速判断是不是 Java 进程吃内存

top # 或 ps -aux | grep java

重点关注:

  • RES / RSS:常驻内存

  • %MEM

  • Java 进程是否持续上涨不回落

✅ 如果非 Java 进程导致,直接处理对应进程即可。


2️⃣ 临时缓解手段(可立即执行)

场景

操作

内存快打满

临时扩容机器 / 增加 swap

无法立即重启

降低流量(限流、切流)

已影响业务

优雅重启服务

⚠️重启前务必保留现场(见第二节)


二、线上定位(核心)

✅ Step 1:确认是哪种内存问题

Java 内存 =Heap + Non-Heap + Off-Heap

1. 查看 JVM 内存概况
jstat -gc <pid> 1000 10

关注指标:

  • OU:Old 区使用量(是否持续增长)

  • YGC / FGC:GC 次数 & 时间

  • FGCT:Full GC 时间是否过长

📌现象判断表

现象

可能原因

Old 区一直涨

内存泄漏

Full GC 频繁但回收少

对象无法释放

Heap 正常但 OS 内存高

Direct Memory / JNI / 线程

Metaspace 增长

动态类加载


✅ Step 2:抓取堆内存快照(最重要)

⚠️必须提前预留磁盘空间(≥ 1.5 × 最大堆)

jmap -dump:live,format=b,file=heap.hprof <pid>

或自动触发(推荐):

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/logs/

✅ Step 3:分析 Heap Dump(本地分析)

工具推荐:

  • MAT(Memory Analyzer)

  • VisualVM

  • JProfiler

重点看:

  1. Dominator Tree

  2. Histogram

  3. GC Roots

📌 常见泄漏点:

  • 静态Map / List / Cache

  • 线程池未释放

  • 监听器 / 回调未注销

  • Session / 连接池泄漏

  • 本地缓存(Guava Cache 无过期)


✅ Step 4:排查非堆内存(非常关键)

1️⃣ 查看 JVM 各区域
jcmd <pid> VM.native_memory summary

重点:

  • Java Heap

  • Class (Metaspace)

  • Thread

  • Code

  • Internal

2️⃣ 常见 Off-Heap 泄漏

类型

说明

DirectByteBuffer

Netty / NIO

JNI

C 堆泄漏

线程栈

线程数暴涨

Zip / 解压流

未 close

📌 Netty 项目90% 是 Direct Memory 问题


✅ Step 5:线程排查(防止隐形内存杀手)

jstack <pid> > jstack.log

检查:

  • 线程数是否异常(几千个)

  • 是否有大量:

    • WAITING (parking)

    • BLOCKED

    • 自定义线程池


三、典型真实案例(对照参考)

🔴 案例 1:静态 Map 缓存泄漏

static Map<String, Object> cache = new HashMap<>();

✅ 解决:

  • 改用WeakHashMap

  • 或设置 TTL(Caffeine)


🔴 案例 2:Netty Direct Memory 泄漏

-XX:MaxDirectMemorySize 未限制

✅ 解决:

-XX:MaxDirectMemorySize=2g

并监控:

BufferPoolMXBean

🔴 案例 3:线程池无限增长

Executors.newCachedThreadPool()

✅ 解决:

  • 使用ThreadPoolTaskExecutor

  • 设置队列 + 拒绝策略


四、长期根治方案(必做)

✅ JVM 参数优化示例

-Xms4g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+HeapDumpOnOutOfMemoryError -XX:NativeMemoryTracking=summary

✅ 监控体系建设

监控项

工具

JVM 内存

Prometheus + JMX Exporter

GC

GC 日志

线程数

Micrometer

Direct Memory

BufferPoolMXBean

OOM 告警

企业微信 / 钉钉


五、标准排查 checklist(可直接给运维)

✅ 是否 Heap 泄漏

✅ 是否 Metaspace 过大

✅ 是否 Direct Memory 未限制

✅ 是否线程数异常

✅ 是否缓存无过期

✅ 是否第三方 SDK Bug


六、我可以继续帮你做的事

如果你愿意,可以把下面信息发我,我可以直接帮你判断根因

  1. JVM 参数(ps -ef | grep java

  2. jstat -gc输出

  3. 使用的框架(Spring Boot / Netty / MQ)

  4. 内存增长曲线(是否线性)

http://www.jsqmd.com/news/919996/

相关文章:

  • 别再乱关服务了!用CCleaner的‘睡眠’功能正确给Win10/Win11电脑内存减负(保姆级设置指南)
  • 避坑指南:UE5.1.1项目重建后,VS项目丢失和IsRenderingThreadHealthy链接错误怎么破?
  • 2026年当前,深度解析:儿童山地自行车公司怎么选择与品牌推荐 - 2026年企业资讯
  • 加密数据湖协议架构与密钥管理实践
  • 2026年国内高文波电流电容定制厂家推荐,电容/电容器,电容生产厂家口碑推荐 - 品牌推荐师
  • AI Agent Harness Engineering 的“脑”与“手”:工具调用(Tool Calling)的底层原理与优化策略
  • 别再只盯着灰度图了!手把手教你用RGB三通道颜色矩做图像分类(附纸币识别完整代码)
  • 跨平台B站客户端PiliPlus完整使用指南:免费开源的全平台观影解决方案
  • 别再让电机乱转了!手把手教你用FOC开环拖动搞定PMSM初始位置(附C代码避坑)
  • 自动驾驶控制入门:如何用二自由度模型为你的仿真小车设计LQR控制器?
  • Instant-NGP里的哈希表魔法:用Python手把手复现多分辨率哈希编码
  • 手把手教你为Dell R730服务器安装VMware ESXi 8.0 U2(附Dell OEM版镜像下载与RAID1配置避坑)
  • ARM GICv2虚拟中断机制与优化实践
  • 别再死记硬背了!用Unity/Unreal Engine的Shader Graph/Blueprint可视化理解OpenGL渲染管线
  • 2026年5月资产评估资质申请服务评测:江苏,上海,河北,申请拍卖资质、申请涉外调查许可证书、申请资产评估备案选择指南 - 优质品牌商家
  • 搞定QEMU虚拟Win10 ARM的网卡和OOBE错误:一份手把手的驱动与注册表修复指南
  • iOS免越狱深度定制终极指南:Cowabunga Lite完全教程
  • 国内儿童悬吊训练器材品牌排行及采购参考解析 - 优质品牌商家
  • 2026西南地区公路波形防撞栏杆现货厂家排行:园区道路隔离景观栏杆定制/城市道路不锈钢隔离栏杆厂家/市政干道灯光一体式防撞护栏/选择指南 - 优质品牌商家
  • 告别CAN总线8字节限制:手把手解析AUTOSAR中ISO 15765传输层如何搞定长报文
  • VCTK数据集下载与预处理保姆级教程:从官网压缩包到110个说话人文件夹的完整流程
  • 保姆级教程:在Ubuntu 22.04上挂载VMFS6数据存储,轻松恢复虚拟机文件
  • 从‘拍扁’到‘展开’:一个玩具例子带你直观理解NeRF位置编码为什么有效
  • 2026年5月西安专业美缝服务选择:聚焦本地实力团队深度解析 - 2026年企业资讯
  • 终极DLSS版本管理神器:DLSS Swapper让你的游戏性能瞬间起飞
  • 2026年6月重庆代账公司服务项目综合排行一览 - 奔跑123
  • 从《鱿鱼游戏》到推荐系统:图解马尔科夫链蒙特卡洛(MCMC)如何悄悄影响你的生活
  • 保姆级教程:手把手教你搞定ThinkSystem服务器Windows Server驱动下载与安装(含RAID卡避坑指南)
  • HBase新手避坑实录:从启动报错到Java API增删改查的完整踩坑指南
  • 别再死记硬背了!用Python和PyTorch从零实现一个Siamese Network(附完整代码)