用于scala的Jerkson Json解析器。

时间:2013-11-11 20:27:54

标签: json scala jackson permgen jerkson

我已经将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)

2 个答案:

答案 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文件的流式读取流式传输到数据库或缓存中,然后仅获取解决特定问题所需的内容。

模糊,我知道,但如果没有更多细节我就无法提供细节。最重要的是流媒体和持久性。