fastjson 反序列化的坑

原文地址:https://www.smoker.cc/java/fuck-fastjson.html

1. 问题

前两天新加需求修改代码,本地没问题。部署测试环境,运行一段时间后,就发现响应特别慢,CPU 飙高。观察了下,是内存不够用,服务疯狂 GC,导致 CPU 飙高,最终 OOM 进程挂掉。于是加了启动参数,OOM 时 dump 出堆内存快照 hprof 文件,分析了下。

上图是用 VisualVM 软件分析的,怀疑是 http-nio-8005-exec-1 线程有问题,点击链接查看:

我擦,这不是 fastjson 么?修改的代码是用到了 fastjson 的反序列化功能。

然后继续观察,确实是新增的这个类引起的。具体成因可参考这篇文章

然后以 内存溢出 搜索 fastjson 在 Github 上的 issue 列表,还有 open 的 issue。官方推荐升级版本,但是有的人反馈升级新版本之后还会有问题。

2. 解决

既然升级新版本反序列化还有可能会有问题,并且我试着升级了下最新版本,有些方法兼容性也有问题。那算啦,反序列化改用其他的库吧。

对于反序列化部分,用 Gson 作了替代:

1

2

3

4

5

6

// import com.google.common.reflect.TypeToken;

TypeToken typeToken =newTypeToken>() {};

// import java.lang.reflect.Type;

Type type = typeToken.getType();

List<User> users = gson.fromJson(json, type);

3. 参考

fastJson与一起堆内存溢出’血案’

Java 中使用 Gson 反序列化 JSON 数据

ParserConfig可能导致内存溢出

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容