调用JNI时引起堆外内存泄漏问题的排查

orient4年前运维问题1442
  • 问题表现:

最近项目中有通过JNI调用linux下动态库的场景,该动态库被多线程并发高频调用时,会造成操作系统内存的急剧上升,最终java进程会被强制下掉。

  • 排查过程:

通过top命令查看进程对资源的使用情况,多线程并发下,物理内存的增长很快,使用完后开始消耗swap空间,当swap空间消耗到一定程度(大概30-40%)时,进程被linux操作系统OOM-KILLER强制下掉,通过/var/log/messages可看到相关日志。

通过JDK自带的jvisualvm控制台查看资源使用情况,堆内存使用正常,并没有出现OOM的问题。并发线程运行也正常。

通过上述排查,怀疑调用的动态库(.so文件)可能有问题,故找到该动态库对应的c文件,审查处理逻辑,在审查中发现,该动态库中有个方法,在开始时,使用malloc函数申请了内存空间,但处理完成后,并未调用free函数对内存空间进行释放,导致并发处理时,内存使用一直处在上升状态。

找到问题后,修改此C程序,重新编译并生成动态库,测试,问题解决。

  • 经验总结:

       遇到JNI调用动态库的场景时,首先要评审动态库的处理逻辑,有条件最好评审动态库的代码,以便及早发现此类问题。


相关文章

Excel查找数据公式

一、提取两列数据相同的数据:=INDEX(左侧列,SMALL(IF(COUNTIF(右侧列,左侧列数据区域)>0,ROW(左侧列数据区域),大于总数据的一个数字), ROW(A1)))&...

不可见字符CR和LF的故事

一、名词解释      CR:Carriage Return,对应ASCII中转义字符\r,表示回车      LF:L...

SSH工具引起的应用乱码解决

 一、问题背景       部署在Weblogic上的客户端应用,反馈通过SSH工具查询出的日志和应用界面中的部分字体(主要是主机下传的报文数据)变成...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。