Java反序列化json内存溢出_fastjson反序列化使用不当致使内存泄露

分析一个线上内存告警的问题时,发现了形成内存告警的缘由是使用fastjson不当致使的。

分析dump发现com.alibaba.fastjson.util.IdentityHashMap$Entry对象比较多。html

查找相关文档

fastjson IdentityHashMap 内存泄漏排查 (这篇文档分析描述的状况与咱们遇到的问题的缘由同样,是使用com.alibaba.fastjson.util.ParameterizedTypeImpl不当致使的)

fastjon官方在很早的版本就修复过相似的问题,https://github.com/alibaba/fastjson/issues/849 ,相关代码:https://github.com/alibaba/fastjson/commit/ef50a5b756a6cab1ab753f4a661bdfb0ccbd6b7e ,他们修复的这个bug是针对com.alibaba.fastjson.TypeReference,这个类实际也是基于com.alibaba.fastjson.util.ParameterizedTypeImpl的。

问题产生的缘由分析

com.alibaba.fastjson.ParserConfig定义一个字段用于缓存不一样类的反序列化器,使用的是IdentityHashMap(IdentityHashMap使用的是==比较key的值,不一样于HashMap使用equals比较),缓存是以Type为key:

private final IdentityHashMap deserializers = new IdentityHashMap();

而咱们的业务代码是在调用一个接口后将结果反序列化,而后每次都去建立一个ParameterizedTypeImpl实例,而fastjson针对每次建立的PamrameterizedTypeImpl都会做为一个key加入到deserizers中进行缓存。java // ... ...

ParameterizedTypeImpl type = new ParameterizedTYpeImpl(new Type[]{ SomeInfo.class }, null, CommonVO.class);

CommonVO result = (CommonVO)JSON.parseObject(jsonString, type);

因此,随着不断的请求发起,内存泄漏产生了。(上面提到的fastjson自

你可能感兴趣的:(Java反序列化json内存溢出_fastjson反序列化使用不当致使内存泄露)