我使用Jerkson for scala,将对象列表序列化为JSON文件。我能够将对象分解为JSON格式的对象并写入文件。现在,当我想要将它读入我的程序以便进一步处理时,我会得到这个错误。FYI,我的文件大小是500 my,将来可能会增加到1GB。
我看到几个论坛要求增加XX:MaxPermSize=256M.我不确定这是否能解决我的问题,即使是现在,当我的JSON文件的大小增加到1GB.Is时,还有什么更好的选择可以保证这一点不会出现呢?谢谢!
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)发布于 2013-11-11 20:57:05
从堆栈跟踪中可以看到,Jackson实习生的字符串被解析为文档中字段的名称。当一个字符串被嵌入时,它会被放入PermGen中,这是堆中正在耗尽的部分。我认为这是因为您的文档有许多不同的字段名--也许是用某种命名方案生成的?不管是什么情况,增加您的MaxPermSize可能会帮助一些人,或者至少延迟问题,但是它不会完全解决问题。
另一方面,禁用杰克逊的字符串实习应该能完全解决这一问题。Jackson FAQ有更多关于要调整的配置选项的信息:intern.28.29ing
发布于 2013-11-11 20:42:31
增加记忆只会治疗症状而不是治愈疾病。我想说的是,这个Jerkson内存问题是一个幸事,它暴露了一个基本的设计缺陷。
至于您是如何治愈这种疾病的,我不能肯定,因为我对您的应用程序或用例一无所知。我很确定你一次不需要1GB的信息。考虑将JSON文件以流方式读取到数据库或缓存中,然后只获取解决特定问题所需的内容。
模糊的,我知道,但如果没有更多的细节,我就不能提供细节。底线是流和持久化。
https://stackoverflow.com/questions/19915293
复制相似问题