Java Scanner#findWithHorizon在32Mb输入流上抛出OutOfMemory异常
搜索字符串“4914904”位于流的尾部 这是密码Java Scanner#findWithHorizon在32Mb输入流上抛出OutOfMemory异常,java,Java,搜索字符串“4914904”位于流的尾部 这是密码 Scanner sc = new Scanner(xmlInputStream, "UTF-8"); if(sc.findWithinHorizon('4914904', 0) != null) { // <--- exception is thrown here } Scanner sc=新的扫描仪(xmlInputStream,“UTF-8”); 如果(sc.findWithinHorizon('491490
Scanner sc = new Scanner(xmlInputStream, "UTF-8");
if(sc.findWithinHorizon('4914904', 0) != null) { // <--- exception is thrown here
}
Scanner sc=新的扫描仪(xmlInputStream,“UTF-8”);
如果(sc.findWithinHorizon('4914904',0)!=null){/在启动Java时使用-Xmx256m
,它将为JVM提供更多堆空间
您可能还想考虑使用XML解析库而不是扫描器,如果您正在处理XML。像SAX或STAX这样的流式API是大输入的最佳选择。
< P>如果您读取Scanner的API,您将看到,如果将参数0传递给它,它将同时读取整个缓冲区。
由于您没有对这个值进行任何操作,因此我看到了一些选项
尝试更改为,然后调用if(sc.hasNext())
,这可能有助于一些人减少内存占用
如果您有XML,请使用XML解析器而不是文本扫描仪
可以考虑编写一种自定义方法,一次一行解析输入流并执行搜索。这样就不必在完整的缓冲区中读取。
增加jvm启动时提供给它的内存-Xmx256m
另请注意:在这里发布时不要重新编写代码。只需复制和粘贴即可。我觉得这不像是有效的Java代码……您希望'4914904'
是什么类型?您有多少内存?如果找不到字符串,它可以将整个文件读入内存,占用的内存最多为文件大小的4倍。(最坏情况)@Jon.你说得对。这不是Java,而是Groovy。不过Java也不能用。@Peter我有16Gb,但我不想让这个简单的操作占用我所有的内存;)我认为扫描仪经过了某种程度的优化,可以从巨大的流中读取数据。我想默认情况下,代码运行在-Xmx512m上,然后就消失了。我对Sax感到厌倦,但我的情况下速度很慢。谢谢sug我将编写我自己的解析器。谢谢。domXML解析器死了,SAX不是我需要的。