繁体   English   中英

java.util.Scanner#findWithHorizon 在 32Mb 输入上抛出 OutOfMemory 异常 stream

[英]java.util.Scanner#findWithHorizon throws OutOfMemory exception on 32Mb input stream

搜索字符串“4914904”存在于 stream 的尾部。

这是代码

    Scanner sc = new Scanner(xmlInputStream, "UTF-8");
    if(sc.findWithinHorizon('4914904', 0) != null) { // <--- exception is thrown here
    }

任何建议将不胜感激。

如果您阅读 Scanner 的 API,您会看到如果您将参数 0 传递给findWithinHorizo n,它将立即读取整个缓冲区。

由于您没有对由此产生的价值做任何事情,因此我看到了一些选择。

尝试更改为useDelimiter(String pattern)然后调用if(sc.hasNext())这可能有助于 memory 足迹。

如果您有 XML,请使用 XML 解析器而不是文本扫描仪。

您可以考虑编写一个自定义方法,一次解析输入 stream 并执行搜索。 这样您就不必读取完整的缓冲区。

增加 memory 你给的 jvm 启动时-Xmx256m

附带说明:在此处发布时不要重新编写代码。 只需复制和粘贴。

启动 Java 时使用-Xmx256m ,它会给 JVM 更多的堆空间。

如果您正在处理 XML,您可能还需要考虑使用 XML 解析库而不是 Scanner。 像 SAX 或 StAX 这样的流式 API 是大输入的最佳选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM