簡體   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