温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java内存泄漏该怎么排查

发布时间:2026-09-19 03:30:17 来源:亿速云 阅读:130 作者:小樊 栏目:编程语言

Java 内存泄漏(Memory Leak)通常指对象已经不再使用,但却因为某些引用关系无法被 GC 回收,导致堆内存持续增长,最终可能触发 OutOfMemoryError: Java heap space。

下面从思路 → 工具 → 实操步骤 → 常见场景系统讲一遍。


一、先确认是不是“真泄漏”

不是所有内存涨都是泄漏:

  • 正常缓存增长
  • 大对象临时使用
  • 堆参数 -Xmx 设置太小

判断标准:

  • 老年代(Old Gen)持续上涨
  • Full GC 后内存不回落
  • 应用运行时间越长,内存越高

二、排查核心思路(非常重要)

内存泄漏 = 强引用未释放

排查步骤一句话总结:

定位泄漏对象 → 找到是谁引用它 → 看代码为什么没释放


三、常用排查工具

1️⃣ 基础命令(先低成本看)

jps                # 查看 Java 进程
jstat -gc <pid>    # 看 GC 情况
jmap -heap <pid>   # 看堆配置和使用

重点看:

  • OU(Old Gen Used)是否一直涨
  • Full GC 后是否下降

2️⃣ 堆转储(最重要)

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

或 JVM 参数(OOM 自动 dump):

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/path/heap.hprof

3️⃣ 分析工具(强烈推荐)

工具 特点
MAT (Eclipse Memory Analyzer) 最强,推荐
VisualVM 轻量
JProfiler 商业,好用
Arthas 线上排查神器

四、MAT 实战排查步骤(重点)

Step 1:打开 heap.hprof

Step 2:看 Leak Suspects

MAT 会自动提示:

“哪些对象占内存最多,谁引用了它们”


Step 3:看 Dominator Tree

找:

  • 占用 Retained Heap 最大的对象
  • 通常是:
    • HashMap
    • ArrayList
    • ThreadLocal
    • 缓存对象

Step 4:看 GC Roots 引用链

右键对象 → Path to GC Roots

你会看到类似:

HashMap
 └── CacheManager.instance
     └── static field

✅ 基本就定位到泄漏点了


五、Arthas 线上快速定位(不用 dump)

# 查看内存占用最大的类
dashboard

# 查看某个类实例数
sc -d com.xxx.User

# 查看对象引用
heapdump /tmp/heap.hprof

六、Java 常见内存泄漏场景(高频)

1️⃣ static 集合未清理

public static List<User> list = new ArrayList<>();

✅ 解决:用 WeakHashMap 或定时清理


2️⃣ ThreadLocal 没 remove

threadLocal.set(obj);
// 忘记 remove

✅ 解决:

try {
  threadLocal.set(x);
} finally {
  threadLocal.remove();
}

3️⃣ 监听器 / 回调未注销

eventBus.register(this);
// 没 unregister

4️⃣ 缓存无限增长

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

✅ 用:

  • WeakReference
  • LRU
  • Caffeine / Guava Cache

5️⃣ 连接 / 流未关闭

InputStream in = ...
// 没 close

✅ try-with-resources


七、预防比排查更重要

✅ 编码规范:

  • 不用 static 存业务对象
  • ThreadLocal 必须 remove
  • 缓存必须有过期策略
  • 资源必须 close

✅ JVM 参数:

-XX:+HeapDumpOnOutOfMemoryError
-XX:+PrintGCDetails

八、一句话总结

Java 内存泄漏排查 = 抓堆 dump + MAT 看引用链 + 改代码断引用

如果你愿意,可以把:

  • 报错信息
  • 堆dump分析截图
  • 相关代码

发出来,我可以直接帮你定位是哪一行在泄漏。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手