前言:
此时各位老铁们对“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泛型序列化