龙空技术网

fastjson带泛型序列化导致内存泄漏

吾日三省Java 6264

前言:

此时各位老铁们对“java泛型序列化”大体比较重视,姐妹们都想要了解一些“java泛型序列化”的相关内容。那么小编在网络上汇集了一些关于“java泛型序列化””的相关内容,希望我们能喜欢,你们一起来了解一下吧!

一、背景

某日早上,生产环境告警群出现了大量响应时间在1s多的慢接口,在应用日志中也能找到不少接口超时熔断(响应时间>=5s)。

当中有不少接口的SQL是能使用索引的,经过DBA排查,数据库没有问题。

在主机上使用top命令查看CPU占用情况,发现有异常:部分主机CPU在50%上下,其中一台主机CPU偶尔就上到300%,一直持续。

二、CPU高排查

1.查消耗Cpu最高的进程PID 41594

shell命令:top -c

2.根据Pid查出消耗Cpu最高的线程号 41600

shell命令:top -Hp 41594

3.这是十进制的数据,转成十六进制为 a280

shell命令:printf "%x\n" 41600

4.导出PID的堆栈信息

shell命令:jstack -l 41594 > 41594.stack

5.在41594.stack中搜索线程号关键字“a280”,发现以下行

"GC task thread#4 (ParallelGC)" os_prio=0 tid=0x00007f41f8026800 nid=0xa280 runnable

搜了top 5的线程号,发现都是GC的线程,说明是堆内存出了问题

三、监控情况

通过Grafana监控查看JVM内存以及GC情况,发现堆内存基本满了

GC次数和时间明显增加

这种情况下就需要获取内存快照来分析,导出内存快照

shell命令:jmap -dump:format=b,file=dump-20210809.hprof 41594

压缩文件后在进行下载

shell命令压缩:tar -czf dump-20210809.hprof.tar.gz dump-20210809.hprof

shell命令下载:sz dump-20210809.hprof.tar.gz

四、dump分析

利用工具MemoryAnalyzer(MAT)分析dump文件,发现1.4G的内存都是com.alibaba.fastjson.parser.ParserConfig这个类占用的

展开list_objects视图查看发现1.4G都耗在com.alibaba.fastjson.util.IdentityHashMap

​网上查询相关资料,发现也有相关问题:fastjson反序列化使用不当导致内存泄露 - liqipeng - 博客园

在代码中搜索关键字‘ParameterizedTypeImpl’,果然是有使用的

​至此,问题已经定位到,跟资料说的一模一样。

接下来就要重现这个问题,写一段循环不停的执行这段代码,循环10万次,然后把堆内存dump出来对比。

​结果如下,有346M都是com.alibaba.fastjson.parser.ParserConfig这个类占用的

com.alibaba.fastjson.util.IdentityHashMap表现也一致

​网上资料也提供了相关的解决方案,这里使用了‘方法二’

​再dump出堆内存快照,com.alibaba.fastjson.parser.ParserConfig已经不出现在视图里了

标签: #java泛型序列化