源程序技术方案:
C-JNI-Java
事件起因:
用户在进行性能测试的过程中,发现运行一段时间,出现heap中内存无法回收,导致客户端挂掉
问题排查:
核心思想-什么对象一直占用内存,没有释放
排查工具:
gc.log
jvisualvm(查看heap中内存变化)
jmap(直观查看内存中对象占用)
mat (通过饼图分析)
分析过程
1.分析内存中对象占用
jmap -histo pid

通过上图可分析:
内存中[C 及java.lang.String对象一直增长,无法回收【注:[C代表char[]】
对应代码
查看代码逻辑

通过代码查看,字符串对象collection keyi没有释放,添加释放后,重新编译,持续运行
最终结果
jmap -histo pid

jvisualvm

通过工具观察,内存回收正常,没有内存泄露
参考链接:
网友评论