内存泄露分析

源程序技术方案:

C-JNI-Java

事件起因:

用户在进行性能测试的过程中,发现运行一段时间,出现heap中内存无法回收,导致客户端挂掉

问题排查:

核心思想-什么对象一直占用内存,没有释放

排查工具:

gc.log

jvisualvm(查看heap中内存变化)

jmap(直观查看内存中对象占用)

mat (通过饼图分析)

分析过程

1.分析内存中对象占用

jmap -histo pid

内存泄露分析_第1张图片

通过上图可分析:

内存中[C 及java.lang.String对象一直增长,无法回收【注:[C代表char[]】

对应代码

查看代码逻辑

内存泄露分析_第2张图片

通过代码查看,字符串对象collection keyi没有释放,添加释放后,重新编译,持续运行

最终结果

jmap -histo pid

内存泄露分析_第3张图片

jvisualvm

内存泄露分析_第4张图片

通过工具观察,内存回收正常,没有内存泄露


参考链接:

在 JNI 编程中避免内存泄漏

内存分析工具使用 

你可能感兴趣的:(内存泄露分析)