Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Scanner#findWithHorizon在32Mb输入流上抛出OutOfMemory异常_Java - Fatal编程技术网

Java Scanner#findWithHorizon在32Mb输入流上抛出OutOfMemory异常

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

搜索字符串“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('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不是我需要的。