首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

EJB 部署 JBoss 出現 OutOfMemoryError:StringBuilder 無限擴容導致堆疊溢位

     編輯:程式設計綜合問答

EJB EAR 部署到 JBoss 時拋出 java.lang.OutOfMemoryError: Java heap space,堆疊追蹤指向 StringBuilder.append → TreeTDBuilder.buildTailingWordsAndAdvanceLinks。日誌顯示正在載入大量字典檔(總計 32 萬條),並在編譯字典樹結構時發生記憶體耗盡。

根本原因:StringBuilder 自我疊加形成無限迴圈

程式碼中疑似出現如下模式:

StringBuilder buffer = new StringBuilder("init");
for (;;) {
    buffer.append(buffer.toString() + buffer.append("data")); // 錯誤:自己調用自己
}

buffer.toString() 會建立新字串,buffer.append(...) 又將結果寫回同一個 buffer,導致容量指數級增長,瞬間耗盡 Heap。

排查與修正建議

  1. 定位程式碼:檢查 TreeTDBuilder.java:141 附近的 StringBuilder 使用,尋找「讀取自身內容再寫回自身」的邏輯。
  2. 改用局部變數:若需迴圈拼接,每次迴圈建立新 StringBuilder 或使用 StringJoiner/List 最後 String.join。
  3. 增加 Heap:臨時緩解可調大 JBoss 啟動參數 -Xmx2g -Xms2g,但必須修復程式碼邏輯。
  4. 分批處理字典:若字典確實巨大,考慮分批載入、外部排序、或使用資料庫/檔案型索引(如 Lucene)替代記憶體樹結構。

日誌關鍵資訊

  • 載入 16 萬+ 條字典,編譯 EN-CN 322051 條、CN-EN 281676 條。
  • buildTailingWordsAndAdvanceLinks 耗時 4 秒後 OOM。

修復 StringBuilder 邏輯錯誤是解決此 OOM 的關鍵;若字典持續增長,架構上應避免全量載入記憶體建樹。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved