您的位置:首页 > 其它

通过Dump分析查找内存泄漏原因的体会

2019-02-18 18:20 225 查看

    背景:公司有个线上的项目,属于比较老的架构,没有什么框架,线上总是出现服务器内存和CPU爆满的情况,而且这个问题从上线开始就一直存在,然后就是每次奔溃后第一时间立即pkill然后重启。。。这个项目虽然我没有参与,但是我需要对它进行维护,每次宕机我就要进行重新启动(PS:小公司手头上零零散散)。最近手头上的项目比较少,于是尝试着寻找原因。找到当时开发这个项目的人员时说查看日志看是数据库连接池的问题,却怎么也看不出什么问题,于是我打算dump下宕机时的内存情况。

    工具:MemoryAnalyzer

    操作:通过top -c查看java进程pid,使用命令jmap -dump:live,format=b,file=heap.bin pid导出内存情况,通过MemoryAnalyzer导入该dump文件

  

通过内存泄漏报告可以看出内存泄漏出现在mysql数据库连接上,点击details查看详情

点击菜单栏树形关系图

可以HashMap中的Statement对象没有释放,导致越来越多的Statement从而造成内存泄漏,于是告诉开发人员让他排查发现,果真是Statement对象没有关闭,PS:如果你使用连接池,那么请注意,Connection关闭并不是物理关闭,只是归还连接池,所以PreparedStatement和ResultSet都被持有,并且实际占用相关的数据库的游标资源,在这种情况下,只要长期运行,往往就会报“游标超出数据库允许的最大值”的错误,导致程序无法正常访问数据库。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: