通过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都被持有,并且实际占用相关的数据库的游标资源,在这种情况下,只要长期运行,往往就会报“游标超出数据库允许的最大值”的错误,导致程序无法正常访问数据库。
相关文章推荐
- Windows用WinDbg分析蓝屏dump文件查找原因(转)
- 利用Java heap dump查找、分析问题
- 段错误原因分析和查找
- 使用WinDbg分析蓝屏dump原因
- 通过Key查找Volume的相关过程分析
- mongodb Profiling 通过慢查询日志分析查询慢的原因 相应优化
- ADPLUS使用配置文件设置断点时无法创建DUMP文件原因分析
- Flash Builder 无法概要分析 原因查找
- 段错误原因分析和查找
- 无法通过百度联盟申请的常见原因分析及解决办法
- 通过崩溃trace来查找问题原因
- 通过VS2010性能分析来查找代码中那些地方最损耗资源 [转]
- <实战> 通过分析Heap Dump 来了解 Memory Leak ,Retained Heap,Shallow Heap
- 无法分析从服务器收到的消息。之所以出现此错误,常见的原因是: 在通过调用 Response.Write() 修改响应时,将启用响应筛选器、HttpModule 或服务器跟踪。
- Android Studio 3.0上分析内存泄漏的原因
- 段错误原因分析和查找
- 通过崩溃trace来查找问题原因
- mongodb Profiling 通过慢查询日志分析查询慢的原因 相应优化
- Google AdSense申请失败及未通过原因分析
- 通过VS2010性能分析来查找代码中那些地方最损耗资源