likes
comments
collection
share

记一次JProfiler生产实战内存分析(二)

作者站长头像
站长
· 阅读数 5

背景

分析过程

打开dump文件,如下 记一次JProfiler生产实战内存分析(二) 基本可以看出,是RealData这个类太多 我们也可以直接从byte[] 数组开始出发进行分析

右键byte[]数组->使用选定对象->合并的传入引用 记一次JProfiler生产实战内存分析(二) 记一次JProfiler生产实战内存分析(二) 依次点开百分比最高的部分 记一次JProfiler生产实战内存分析(二) 最终发现1个实例来自于RealValueContext这个类 打开代码,搜索该类 记一次JProfiler生产实战内存分析(二) 发现里面有一个realDataList的属性,猜测应该是这个list中数据多导致。

右键选中该类->使用引用持有者->传出引用 记一次JProfiler生产实战内存分析(二) 查看当前对象的相关属性 记一次JProfiler生产实战内存分析(二) 这个对象有1600多M,这个list里面有1200W大小,原因找到。

分析一下代码,看看为啥会有这么多。 记一次JProfiler生产实战内存分析(二) 记一次JProfiler生产实战内存分析(二) 这个属性的使用是用来通过批量的方式,提高保存redis的效率。每次执行完定时任务后,该内存就会回收调,看来应该是这个定时任务没有执行导致的。

这个定时任务会在项目启动的时候就会初始化执行,那为啥会没有执行呢?

定时任务报错导致后续任务中断。

写一个demo试试 记一次JProfiler生产实战内存分析(二) 记一次JProfiler生产实战内存分析(二) 模拟异常情况 记一次JProfiler生产实战内存分析(二) 记一次JProfiler生产实战内存分析(二) 任务中断了。

解决方案

try catch一下 记一次JProfiler生产实战内存分析(二) 记一次JProfiler生产实战内存分析(二) 修改代码,上线,问题解决!