Java反序列化json内存溢出_fastJson与一起堆内存溢出'血案'

本文介绍了由于Java反序列化json过程中出现内存溢出的问题,详细分析了问题的原因,涉及fastjson库。通过日志、JVM命令和内存分析工具MAT的使用,定位到问题出在配置类PersonalityStrengthenConfig的cost字段,由于反序列化错误模式导致每次反序列化都会增加null,最终导致内存溢出。解决方案是确保在序列化时添加SerializerFeature.IgnoreNonFieldGetter参数,避免非字段get方法的序列化。
摘要由CSDN通过智能技术生成

现象

QA同学反映登录不上服务器

排查问题1–日志级别

查看log,发现玩家登录的时候抛出了一个java.lang.OutOfMemoryError

大概代码是向Redis序列化一个PlayerMirror镜像数据,但是在JSON.toJSONString的时候出现了错误.比较清晰,即序列化的时候expandCapacity,内存不足。

又看了一下日志,有好几个OutOfMemoryError,都是类似于用fastjson序列化PlayerMirror报的错误

又仔细看了一下server目录,发现了几个.hprof,说明确实发生了堆内存溢出,因为启动参数增加了’-XX:+HeapDumpOnOutOfMemoryError’

at java.lang.OutOfMemoryError.()V (OutOfMemoryError.java:48)

at com.alibaba.fastjson.serializer.SerializeW

riter.expandCapacity(I)V (SerializeWriter.java:249)复制

-rw------- 1 xx xx 2043416350 Nov 24 11:37 java_pid8068.hprof

-rw------- 1 xx xx 2028797313 Nov 24 11:17 java_pid4671.hprof

-rw------- 1 xx xx 1477222612 Nov 23 23:25 java_pid31563.hprof复制

排查问题2–JVM命令级别

使用了jvm命令初步排查一下问题 jstat -gcutil pid

jstat -gc pid

jmap -histo pid

jmap -heap pid

jstat看到老年代基本已经满了

jmap看到排名前两位的分别是Object[]和char[]

num #instances #bytes class name

----------------------------------------------

1: 146219 741203672 [Ljava.lang.Object;

2: 2842356 639498168 [C复制

排查问题3–专业工具级别

因为了hprof,所以只需要用专业的内存分析工具mat即可 mat#Open Heap Dump,载入后直接出来一个Getting Started Wizard#Leak Suspects Report,即内存泄露的报告,选择finish 两个怀疑的问题:

其中有一个JSONArray的实例就占用了大约700M内存

另外一个是线程的local Variables占用了500M内存

f238e6b3dca3335c5dc46349efb58aad.png

点开问题1详情,发现这个JSONArray是配置类PersonalityStrengthenConfig#cost字段,仔细看一下这

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值