使用GsonBuilder的静态实例创建Gson实例时发生内存泄漏

时间:2014-07-28 01:45:16

标签: java memory-leaks static gson

我使用Google的优秀Gson库进行JSON(反)序列化。我正在利用GsonBuilder类为某些类创建带有自定义序列化程序的Gson对象。在部署代码之后的某个时刻,我突然开始出现Heap Overflow错误。

我研究了堆转储,它指向static final类的GsonBuilder对象:

public static final GsonBuilder JSONIFIER_BUILDER = new GsonBuilder().registerTypeAdapter(Article.class, new ArticleSerializer());

要从构建器创建Gson对象,我的代码中有多个应用程序正在使用该方法。

public String serialize(Object contextObject) {
    Gson jsonifier = JSONIFIER_BUILDER.registerTypeAdapter(Config.class, new ConfigSerializer(contextObject)).create();
    return jsonifier.toJson(this);
}

从查看堆转储我只能推断JSONIFIER_BUILDER以某种方式引用它创建的Gson对象的所有实例。

有人可以告诉我,我是否得出了正确的结论?如果是这样,我怎么能避免这个问题呢?我目前对代码进行了更改,以便序列化程序方法看起来像这样:

public String serialize(Object contextObject) {
    Gson jsonifier = new GsonBuilder()
                                .registerTypeAdapter(Article.class, new ArticleSerializer()).registerTypeAdapter(Config.class, new ConfigSerializer(contextObject)).create();
        return jsonifier.toJson(this);
}

1 个答案:

答案 0 :(得分:1)

public String serialize(Object contextObject) {
   Gson jsonifier = JSONIFIER_BUILDER.registerTypeAdapter(Config.class, new ConfigSerializer(contextObject)).create();
   return jsonifier.toJson(this);
}

您不断向静态构建器注册新类型。它显然没有覆盖前一个。

GsonBuilder source