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

标签 java memory-leaks static gson

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

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

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);
}

最佳答案

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

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

GsonBuilder source

关于java - 使用GsonBuilder的静态实例创建Gson实例时发生内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24993258/

相关文章:

java - 在 httpResponse 的正文中设置字符串

java - 线程和按钮 : How to restart the program after its finished running

java - 垫 : How do you diagnose "x instances of "byte[ ]", loaded by "<system class loader >"occupy y (z%) bytes" memory issues?

java - 警告 : The type parameter E is hiding the type E when using an inner class

java - 使用 Spring Security 的静态方法获取当前用户详细信息

java - AES 解密适用于 Solaris 机器 SunJCE,但不适用于具有 IBMJCE 的 AIX 机器

java - 从 Date 对象中删除毫秒部分

c++ - gcc/linux : CppuTest shows memory leak using static vectors, 误报?

java - 用java播放声音时内存泄漏

c - 如何在不调用声明它的函数的情况下修改局部静态变量?