ObjectMapper SerializerCache 的单个实例中的对象过多导致内存泄漏

Posted

技术标签:

【中文标题】ObjectMapper SerializerCache 的单个实例中的对象过多导致内存泄漏【英文标题】:Too Many objects in single instance of ObjectMapper SerializerCache causing memory leak 【发布时间】:2016-12-09 06:01:56 【问题描述】:

我们正在运行一个基于 Spring Boot 的服务,我们在运行性能测试时遇到了 GC 问题。当我们查看 Eclipse 插件“内存分析工具包”(MAT)上的堆转储时,我们发现如下:

One instance of "com.fasterxml.jackson.databind.ObjectMapper" loaded by "org.apache.catalina.loader.WebappClassLoader @ 0x1000050b8" occupies 2,057,443,904 (93.15%) bytes. The memory is accumulated in one instance of "com.fasterxml.jackson.databind.ser.SerializerCache" loaded by "org.apache.catalina.loader.WebappClassLoader @ 0x1000050b8".
Keywords
com.fasterxml.jackson.databind.ser.SerializerCache
com.fasterxml.jackson.databind.ObjectMapper
org.apache.catalina.loader.WebappClassLoader @ 0x1000050b8

不太清楚这里发生了什么。为什么 SerializerCache 会在 Map 中保存这么多对象,以及如何清除它。

使用 SpringIO:2.0.6.RELEASE

【问题讨论】:

【参考方案1】:

SpringIO 2.0.6.RELEASE 使用 jackson 版本 2.6.7,顺便提一下,它没有出现在 master 分支的 Jackson 发布页面 (https://github.com/FasterXML/jackson-databind/blob/master/release-notes/VERSION)。 我升级了我的应用程序以使用杰克逊版本 2.8.1 并解决了问题。

【讨论】:

以上是关于ObjectMapper SerializerCache 的单个实例中的对象过多导致内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

ObjectMapper - 线程安全和性能的最佳实践

无法在 Swift 中导入 ObjectMapper

ObjectMapper 和具有唯一键的数组

Alamofire,Objectmapper,Realm:嵌套对象

JAVA操作ObjectMapper类

Swift - 嵌套对象的映射 (Objectmapper)