这是一个典型的 Java 线上内存问题可以按「应急止血 → 定位根因 → 长期根治」三个阶段来处理。下面给你一套可直接用于生产环境的标准排查流程。一、应急止血先保系统目标不让服务继续恶化争取排查时间1️⃣ 快速判断是不是 Java 进程吃内存top # 或 ps -aux | grep java重点关注RES / RSS常驻内存%MEMJava 进程是否持续上涨不回落✅ 如果非 Java 进程导致直接处理对应进程即可。2️⃣ 临时缓解手段可立即执行场景操作内存快打满临时扩容机器 / 增加 swap无法立即重启降低流量限流、切流已影响业务优雅重启服务​⚠️重启前务必保留现场见第二节二、线上定位核心✅ Step 1确认是哪种内存问题Java 内存 Heap Non-Heap Off-Heap1. 查看 JVM 内存概况jstat -gc pid 1000 10关注指标OUOld 区使用量是否持续增长YGC / FGCGC 次数 时间FGCTFull GC 时间是否过长现象判断表现象可能原因Old 区一直涨内存泄漏Full GC 频繁但回收少对象无法释放Heap 正常但 OS 内存高Direct Memory / JNI / 线程Metaspace 增长动态类加载✅ Step 2抓取堆内存快照最重要⚠️必须提前预留磁盘空间≥ 1.5 × 最大堆jmap -dump:live,formatb,fileheap.hprof pid或自动触发推荐-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/data/logs/✅ Step 3分析 Heap Dump本地分析工具推荐MATMemory AnalyzerVisualVMJProfiler重点看Dominator TreeHistogramGC Roots 常见泄漏点静态Map / List / Cache线程池未释放监听器 / 回调未注销Session / 连接池泄漏本地缓存Guava Cache 无过期✅ Step 4排查非堆内存非常关键1️⃣ 查看 JVM 各区域jcmd pid VM.native_memory summary重点Java HeapClass (Metaspace)ThreadCodeInternal2️⃣ 常见 Off-Heap 泄漏类型说明DirectByteBufferNetty / NIOJNIC 堆泄漏线程栈线程数暴涨Zip / 解压流未 close Netty 项目90% 是 Direct Memory 问题✅ Step 5线程排查防止隐形内存杀手jstack pid jstack.log检查线程数是否异常几千个是否有大量WAITING (parking)BLOCKED自定义线程池三、典型真实案例对照参考 案例 1静态 Map 缓存泄漏static MapString, Object cache new HashMap();✅ 解决改用WeakHashMap或设置 TTLCaffeine 案例 2Netty Direct Memory 泄漏-XX:MaxDirectMemorySize 未限制✅ 解决-XX:MaxDirectMemorySize2g并监控BufferPoolMXBean 案例 3线程池无限增长Executors.newCachedThreadPool()✅ 解决使用ThreadPoolTaskExecutor设置队列 拒绝策略四、长期根治方案必做✅ JVM 参数优化示例-Xms4g -Xmx4g -XX:UseG1GC -XX:MaxGCPauseMillis200 -XX:HeapDumpOnOutOfMemoryError -XX:NativeMemoryTrackingsummary✅ 监控体系建设监控项工具JVM 内存Prometheus JMX ExporterGCGC 日志线程数MicrometerDirect MemoryBufferPoolMXBeanOOM 告警企业微信 / 钉钉五、标准排查 checklist可直接给运维✅ 是否 Heap 泄漏✅ 是否 Metaspace 过大✅ 是否 Direct Memory 未限制✅ 是否线程数异常✅ 是否缓存无过期✅ 是否第三方 SDK Bug六、我可以继续帮你做的事如果你愿意可以把下面信息发我我可以直接帮你判断根因JVM 参数ps -ef | grep javajstat -gc输出使用的框架Spring Boot / Netty / MQ内存增长曲线是否线性