fastjson 反序列化的坑

fastjson 反序列化的坑_第1张图片

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

1. 问题

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

fastjson 反序列化的坑_第2张图片

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

fastjson 反序列化的坑_第3张图片

我擦,这不是 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 users = gson.fromJson(json, type);

3. 参考

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

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

ParserConfig可能导致内存溢出

你可能感兴趣的:(fastjson 反序列化的坑)