在Ubuntu上排查Java内存泄漏可按以下步骤进行:
- 监控内存使用
- 用
top或htop命令观察Java进程内存是否持续上升。
- 通过
jstat -gc <pid>监控GC情况,查看老年代内存占用及Full GC频率。
- 生成堆转储文件
- 使用
jmap -dump:live,format=b,file=heapdump.hprof <pid>生成堆转储文件。
- 分析堆转储文件
- 用Eclipse MAT或VisualVM打开堆转储文件,查看内存占用高的对象及引用链,重点关注静态集合、缓存、线程局部变量(ThreadLocal)等。
- 代码审查
- 检查静态集合是否未清理、资源(如数据库连接、文件流)是否未关闭、监听器是否未注销。
- 确保ThreadLocal使用后调用
remove()方法。
- 调整JVM参数
- 优化堆内存大小(
-Xms和-Xmx)及垃圾回收器(如使用G1 GC:-XX:UseG1GC)。
- 压力测试与验证
- 通过工具(如JMeter)模拟高负载,观察内存是否持续增长,验证修复效果。
常用工具:
- 命令行:
jstat、jmap、jcmd。
- 图形化:VisualVM、Eclipse MAT、JProfiler。
参考来源: