我可以让 Gson.fromJson() 使用 String.intern 还是对频繁使用的字符串使用 StringPool

Can I make Gson.fromJson() use String.intern or use a StringPool for heavily used Strings

我正在使用 Gson 反序列化大量 JSON 文档,性能分析表明垃圾收集难以跟上,因此挂起时间非常长。我怀疑 Gson 为 JSON 文档中的所有元素创建了大量字符串,并且在处理后这些字符串很快又被释放了。

我用谷歌搜索并发现 some discussion 没有任何线索。

我同意对所有字符串进行实习是没有用的,如果您指定应该实习哪些内容,通常实习会很有用,例如JSON 中的地图键通常是一个不错的选择。

有没有办法告诉 Gson 要实习哪些字符串,例如通过专门的序列化程序?或者有没有办法为映射键之类的东西创建一个 StringPool,以避免必须一直在堆上分配这些项目。

可能不是一个完整的解决方案,但我发现 addDeserializationExclusionStrategy() 允许在实际反序列化之前决定创建字段,这也有助于减少 JSON 解析产生的开销:

        new GsonBuilder().addDeserializationExclusionStrategy(new ExclusionStrategy() {

            @Override
            public boolean shouldSkipField(FieldAttributes f) {
                return false;
            }

            @Override
            public boolean shouldSkipClass(Class<?> clazz) {
                return false;
            }
        }).