首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

解決 java.lang.OutOfMemoryError: allocLargeArray 記憶體溢位完整指南

     編輯:Java 相關知識

錯誤現象

Tomcat 日誌報錯:

Caused by: java.lang.OutOfMemoryError: allocLargeArray - Object size: 80040, Num elements: 40010

意指:嘗試分配 80,040 位元組的陣列(40,010 個元素),但 Heap 無可用空間。陣列在 JVM 中也是物件,分配於 Heap。

解決方案

  1. 調整 JVM 參數,適當增大 Heap
  2. 清理無用日誌、優化 Apache 參數、開啟 GC 日誌收集 Heap 使用資訊

JVM 記憶體設定原理

java -Xms64m -Xmx256m Test
-Xms:初始 Heap 大小
-Xmx:最大 Heap 大小(勿超過物理記憶體)

WebLogic 可在 startWebLogic.cmd 或 commEnv.cmd 設定。

JVM 記憶體調優詳細策略

Heap 結構與 GC 運作

Heap 分三區:Young(新生代)、Old(老年代)、Permanent(永久代)。新建物件置於 Young,滿時 GC 移至 Old。Permanent 存放反射物件。

關鍵參數

  • -Xms:初始 Heap
  • -Xmx:最大 Heap
  • -Xmn:Young 區大小

Old 區大小 = -Xmx - Xmn。-Xms 過大會迫使第二 GC 線程頻繁運行降低性能。

頻繁 GC 成因

  • 代碼呼叫 System.gc() 或 Runtime.gc()
  • 中介軟體自行觸發 GC(需參數禁止)
  • Heap 過小(預設值通常很小)
  • 頻繁實例化並釋放物件(建議重用,如用 StringBuffer 替代 String)

健康指標與經驗值

  • GC 後剩餘 ≥ 50% 總空間 → Heap 健康
  • Server 端最好 ≥ 65% 剩餘
  • Server 端建議 -Xms = -Xmx,-Xmn ≈ -Xmx / 3
  • GUI 程式建議每 10-20 秒 GC 一次,耗時 < 0.5 秒

注意事項

  1. 增大 Heap 雖降低 GC 頻率,但增加單次 GC 時間;GC 期間所有使用者線程暫停
  2. 進程記憶體用量 > -Xmx(含線程 Stack 等)
  3. -Xss 設定線程 Stack 大小,影響最大線程數;過大導致 OOM,過小導致 StackOverflow
  4. 硬體環境(機型、記憶體、Swap、CPU 核心數)影響 GC 效率;頻繁建立短命物件可增加記憶體減少 Swap 使用

四種 GC 模式選擇

類型特點適用場景啟動參數
單線程 GC預設單 CPU無
Throughput GCYoung 區多線程,Old 區單線程多 CPU、大量線程-XX:+UseParallelGC
Concurrent Low Pause GCOld 區回收同時運行應用多 CPU、需縮短停頓-XX:+UseConcMarkSweepGC
Incremental Low Pause GCYoung 區回收同時回收部分 Old 區需縮短停頓-Xincgc

總結

遭遇 allocLargeArray OOM,優先檢查 Heap 設定是否過小、是否存在記憶體洩漏或短命大物件分配。依據應用類型選擇適當 GC 策略,設定合理的 -Xms/-Xmx/-Xmn,並開啟 GC 日誌持續監控。記憶體調優是系統工程,需綜合代碼、配置、硬體多維度考量。

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