M 使用 java visualVM分析系统gc后,dump日志
2021-03-16 17:54:28 93 庶卒 版本: 7 引用率 95.02%
# 使用 java visualVM分析系统gc后,dump日志100.00%      

系统gc了,排查了半天是半年前的一个bug,在及其特殊的操作情况下会导致全表扫描。100.00%      

记录下分析dump日志的过程。100.00%      

## 工具100.00%      

使用的java自带的 jvisualvm 工具

![](/ncimg/M00/00/0A/rBIgzWA2AceAU_RvAABBXkJP3YU006.png)100.00%      

双击打开即可,但是有个问题就是这个工具初始工作内存分得256m,分析太大的dump文件,很慢。100.00%      

解决办法,修改如下的配置文件,吧参数调大点就行。100.00%      

![](/ncimg/M00/00/0A/rBIgzWA2AmWAHRzaAAAtLzlO0tE476.png)100.00%      

```
-J-Xms1024m -J-Xmx4096m
```100.00%      

## 1 打开后,文件-装入,选择下载好的dump文件100.00%      

![](/ncimg/M00/00/0A/rBIgzWA2At2AHCNWAAAtefcjxRk487.png)100.00%      

## 2 切换到 类 标签页面,根据大小找到使用最多的自己项目的实体,如下所示。100.00%      

![](/ncimg/M00/00/0A/rBIgzWA2A5WADFr8AAFTIzFV4oM964.png)100.00%      


## 3 鼠标双击,自动跳转到实例数标签页,在引用模块中,找到**垃圾回收根节点**标志的节点,鼠标右键选择在线程中显示。100.00%      

![image.png](/ncimg/M00/00/0A/rBIgzWA2CgOAboODAAGQCpULFz0926.png)100.00%      


## 4 现在找到产生大对象的线程了,然后就是分析这个线程是自己项目的那个功能。100.00%      

![image.png](/ncimg/M00/00/0A/rBIgzWA2EBuAaC0oAAG2pXGAEZ0823.png)100.00%      

## 5 线程请求入口100.00%      

![image.png](/ncimg/M00/00/0A/rBIgzWA2ENmAQzBtAADArLUW6B0838.png)100.00%      

## 6 线程最终的执行方法,可以看到是执行了一个sql查询,点击图中的链接。100.00%      

![image.png](/ncimg/M00/00/0A/rBIgzWA2Eb2AGKyAAAEnCWDVGLs353.png)100.00%      

## 7 再次跳转到实例数标签页,在字段中可以看到有个sql,打开后双击value。100.00%      

![image.png](/ncimg/M00/00/0A/rBIgzWA2EkyAB_ABAAESB52w648479.png)100.00%      

## 8 再次跳转到实例数标签页,这次数组项中,可以看到造成大对象的sql如下。100.00%      

![image.png](/ncimg/M00/00/0A/rBIgzWA2EvmAancHAAFKTRka8ek658.png)100.00%      

## 9 ok 大对象的线程入口,及造成大对象的原因都找到了,剩下的就是翻代码,堵上漏洞。100.00%      

## 10 完结撒花100.00%