0X00-问题现象:

进入XX系统资源页面,XX管理页签数据无法显示,F12查看后端请求报错。

0X01-定位过程:

1、F12查看后端请求报错


2、根据报错信息,判断XX服务可能存在问题,查看XX服务日志

使用 jstat -gcutil -pid 1000 20 每一秒打印一次gc信息,打印20次查看结果。发现FGC在频繁发生,差不多每5秒发生一次。FGC发生次数达到了3571次(运行8小时)
gc打印信息

3、通过导出dump使用MAT工具进行分析

使用如下命令导出对应服务的dump文件

1
2
3
sudo docker exec -it `sudo docker ps | grep xx | awk '{print $1}'` /bin/bash -c "jmap -dump:format=b,file=xx.dump 6"

sudo docker cp `sudo docker ps | grep xx | awk '{print $1}'`:/opt/project/galaxy_device.dump

mat内存分析
点击Leak Suspects 查看内存泄漏报告
Leak Suspects Report
如图,总共有3.6GB内存泄漏。
查看All Accmulated Objects by Class ,有大量的Camera未释放。直接查看源码,找到CameraStatusSync类
all accmulated objects by class
点击java.lang.String,右键show objects by class → by incoming refrences (查找拥有当前对象引用的所有对象)
 incoming refrences
具体类
根据以上内容分析得知:内存泄漏的代码发生在syncStatusFromCore1方法
代码逻辑很清晰,每分钟从第三方服务更新相机状态。后面只需解决此问题