背景
由于业务并发增高,或者大SQL累积,常常会发生dbproxy FULL GC甚至内存溢出导致进程挂掉。客户常常需要让给出具体SQL,导致进程内存溢出或FULL GC。
在进程内存溢出或者FULL GC时,日志打印、监控等功能往往不正常工作,不能有效****即时提供分析结果,即不能给出内存溢出瞬间的内存 SQL处理情况。此时,内存的分析是一种有效手段和佐证。
本文提供用hprof文件、使用Jprofiler查看和定位SQL的方法。
慢日志、慢日志分析工具(内部开发)可有效提供****内存未溢出、GC不严重时的慢SQL统计信息,可用作分析业务变化或统计的手段
说明
- 本地版本,Mac Jprofiler 14.0.3
- 已具备hprof文件。方式一:进程内存溢出自己生成;方式二,手动jmap生成
jmap -dump:format=b,file=heapdump.hprof $pid
具体操作
- 打开Jprofiler软件,选择打开快照,并选中hprof文件
- 等待加载,加载后如下所示
此时,可以看到内存中有大量的占用,其中的byte、Object绝大多都是SQL查询或插入的数据。
- 为了定位具体SQL,需要检索处理SQL相关的方法,在输入框输入
SingleNodeHandler
- 使用选择对象
点击确定
生成如下的实例
- 根据实例,反推相关的SQL。以某一个实例为例,
展开箭头,选择rrs->statement,
右击,查看节点详细信息
可以看到具体sql:
- 可选搜索处理,不一定有此实例。
当出现大数据量merge汇聚时,还可类似SingleNodeHandler的处理,搜索
MultiNodeHandler`,查看stmt的sql,并查看其扫描汇聚大小。
由于本地没有相关的hprof文件,用之前处理线上的截图做参考示例。