我已经将Jerkson用于scala,将我的对象列表序列化为JSON文件。我能够将对象分解为JSON格式对象并写入文件。现在,当我想将它读入我的程序进行进一步处理时,我得到了这个错误。仅供参考,我的文件大小为500MB,将来可能增长到1GB。
我看到很少有论坛要求增加 XX:MaxPermSize = 256M 。我不确定这是否能解决我的问题,即使现在这样做,当我的JSON文件的大小增加到1GB时,这可能不会出现的保证是什么。有更好的选择吗?谢谢!
Exception in thread "main" java.lang.OutOfMemoryError: PermGen space
at java.lang.String.intern(Native Method)
at org.codehaus.jackson.util.InternCache.intern(InternCache.java:41)
at org.codehaus.jackson.sym.CharsToNameCanonicalizer.findSymbol(CharsToNameCanonicalizer.java:506)
at org.codehaus.jackson.impl.ReaderBasedParser._parseFieldName(ReaderBasedParser.java:997)
at org.codehaus.jackson.impl.ReaderBasedParser.nextToken(ReaderBasedParser.java:418)
at com.codahale.jerkson.deser.ImmutableMapDeserializer.deserialize(ImmutableMapDeserializer.scala:32)
at com.codahale.jerkson.deser.ImmutableMapDeserializer.deserialize(ImmutableMapDeserializer.scala:11)
at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2704)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1315)
at com.codahale.jerkson.Parser$class.parse(Parser.scala:83)
at com.codahale.jerkson.Json$.parse(Json.scala:6)
at com.codahale.jerkson.Parser$class.parse(Parser.scala:14)
at com.codahale.jerkson.Json$.parse(Json.scala:6)
答案 0 :(得分:3)
从堆栈跟踪中我们可以看到Jackson实例化了被解析为文档中字段名称的字符串。当一个String被实现时,它被放入PermGen中,这是你用完的堆的一部分。我认为这是因为你的文档有很多很多不同的字段名称 - 可能会产生一些命名方案?无论如何,增加你MaxPermSize可能会帮助一些,或者至少可以延迟问题,但它不会完全解决它。
另一方面,在杰克逊禁用字符串实习应该完全解决它。 Jackson FAQ提供了有关调整哪些配置选项的更多信息: http://wiki.fasterxml.com/JacksonFAQ#Problems_with_String_intern.28.29ing
答案 1 :(得分:1)
添加记忆只会治疗症状而不是治愈疾病。我想说这个Jerkson记忆问题是伪装的一种祝福,暴露了一个基本的设计缺陷。
关于你如何治愈这种疾病,我不能肯定地说,因为我对你的申请或用例一无所知。我很确定您一次不需要1 GB的信息。考虑将JSON文件的流式读取流式传输到数据库或缓存中,然后仅获取解决特定问题所需的内容。
模糊,我知道,但如果没有更多细节我就无法提供细节。最重要的是流媒体和持久性。