fastjson 导致内存泄漏

fastjson 导致内存泄漏_第1张图片

如何定位内存泄漏

  • 线上环境发布一个服务,这个服务每次跑3~4天的时间,服务的CPU就比较高,而且CPU高一直都降不下来
  • 通过阿里开源的脚本工具 show-busy-java-threads.sh 查看服务的堆栈信息(sh show-busy-java-threads.sh show-busy-java-threads -p pid),发现服务一直在进行 Full GC
  • 通过重启服务之后,CPU 能够降下来,但是跑了几天后,又开始 Full GC,由此可以断定服务某一块的代码发生了内存泄漏
  • 在CPU升高的时候,通过 jmap 命令查询 jvm 中的堆中的存活对象 (jmap -histo pid | head -n 20 查看存活对象前20个)
    fastjson 导致内存泄漏_第2张图片
  • 通过查看存活对象的个数,发现有个 com.alibaba.fastjson 包下 FieldInfo 对象个数特别多,通过这里可以推断出基本是 fastjson 反序列化导致的内存泄漏
  • 刚好发布的服务有对接到三方平台,调用三方的API接口获取到 String,然后将其进行反序列化
fastjson 导致内存泄漏_第3张图片 fastjson 导致内存泄漏_第4张图片

内存泄漏的原因

  • 泛型传递的原因导致每次反序列化时 fastjson 都换成了一个 FieldInfo 对象然后又被引用着导致不能被回收

如何修复内存泄漏

  • 使用 TypeReference
    fastjson 导致内存泄漏_第5张图片

  • 替换解析方式,不按照有泛型的对象反序列化,先解析成 JSONObject 对象,再从 JSONObject 获取对应的请求结果
    fastjson 导致内存泄漏_第6张图片

你可能感兴趣的:(Java,jvm,java,开发语言)