EJB EAR 部署到 JBoss 時拋出 java.lang.OutOfMemoryError: Java heap space,堆疊追蹤指向 StringBuilder.append → TreeTDBuilder.buildTailingWordsAndAdvanceLinks。日誌顯示正在載入大量字典檔(總計 32 萬條),並在編譯字典樹結構時發生記憶體耗盡。
程式碼中疑似出現如下模式:
StringBuilder buffer = new StringBuilder("init");
for (;;) {
buffer.append(buffer.toString() + buffer.append("data")); // 錯誤:自己調用自己
}
buffer.toString() 會建立新字串,buffer.append(...) 又將結果寫回同一個 buffer,導致容量指數級增長,瞬間耗盡 Heap。
TreeTDBuilder.java:141 附近的 StringBuilder 使用,尋找「讀取自身內容再寫回自身」的邏輯。StringBuilder 或使用 StringJoiner/List 最後 String.join。-Xmx2g -Xms2g,但必須修復程式碼邏輯。buildTailingWordsAndAdvanceLinks 耗時 4 秒後 OOM。修復 StringBuilder 邏輯錯誤是解決此 OOM 的關鍵;若字典持續增長,架構上應避免全量載入記憶體建樹。