字节流的博客

fastjson 反序列化的坑

wtf

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 = new TypeToken<List<User>>() {};
// import java.lang.reflect.Type;
Type type = typeToken.getType();

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

3. 参考

  1. fastJson与一起堆内存溢出’血案’
  2. Java 中使用 Gson 反序列化 JSON 数据
  3. ParserConfig可能导致内存溢出
Thanks! 😊