=========================================================================
JBoss Bootstrap Environment
JBOSS_HOME: /home/cdms/jboss-4.0.5.GA
JAVA: /home/cdms/jdk1.6.0_32/bin/java
JAVA_OPTS: -Dprogram.name=run.sh -server -Xms12000m -Xmx12000m -XX:NewSize=256m
-Xss128k -XX:MaxNewSize=512m -XX:PermSize=128m -XX:MaxPermSize=512m
-XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled
CLASSPATH: /home/cdms/jboss-4.0.5.GA/bin/run.jar:/home/cdms/jdk1.6.0_32/lib/tools.jar
=========================================================================
Error occurred during initialization of VM
Could not reserve enough space for object heap
JVM 堆記憶體設定 (-Xms12000m -Xmx12000m) 遠超實體可用記憶體。
free -m
# 輸出範例:
# total used free shared buff/cache available
# Mem: 7890 6500 200 150 1190 1000
# Swap: 2047 500 1547
關鍵看 **available** 欄位 (含可回收緩衝),此為 JVM 實際可分配上限。
echo 1 > /proc/sys/vm/drop_caches
# 或
sync && echo 3 > /proc/sys/vm/drop_caches
僅能回收 `buff/cache`,無法解決根本設定錯誤。
編輯 JBoss 啟動腳本 (通常為 `bin/run.conf` 或 `bin/run.sh`):
# 原錯誤設定 (12GB)
# JAVA_OPTS="-Xms12000m -Xmx12000m ..."
# 修正為合理值 (視實體 RAM 而定,建議留 1-2GB 給 OS)
# 範例:實體 8GB → 給 JVM 4-5GB
JAVA_OPTS="-Xms4096m -Xmx4096m -XX:NewSize=512m -XX:MaxNewSize=1024m \
-XX:PermSize=128m -XX:MaxPermSize=256m \
-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled"
| 參數 | 建議值 | 說明 |
|---|---|---|
| -Xms / -Xmx | 實體 RAM 的 50-70% | 設定相同值避免動態擴縮停頓 |
| -XX:NewSize / -XX:MaxNewSize | 堆的 1/4 ~ 1/3 | 年輕代過小導致頻繁 Minor GC |
| -XX:PermSize / -XX:MaxPermSize (JDK 7-) | 128m / 256m | 類元資料區,JDK 8+ 改用 Metaspace |
| -XX:MetaspaceSize / -XX:MaxMetaspaceSize (JDK 8+) | 128m / 512m | 替代 PermGen |
| -Xss | 256k - 512k | 執行緒堆疊,過小導致 StackOverflow |
| -XX:+UseG1GC (JDK 7u4+) | 推薦大堆 (>4GB) | 低延遲、自動分區、避免 Full GC 停頓 |
nohup /home/cdms/jboss-4.0.5.GA/bin/run.sh &
tail -f nohup.out
# 確認無 "Could not reserve enough space" 錯誤
ps -ef | grep jboss
# 應看到 java 進程正常運行
| 誤區 | 正確做法 |
|---|---|
| 記憶體越大越好 | 超過實體 RAM 會導致 Swap 暴增、GC 停頓劇增、甚至 OOM Killer 殺掉進程 |
| 只調 -Xmx 不調 -Xms | 動態擴張會觸發 Full GC,生產環境建議 -Xms=-Xmx |
| 忽略 Metaspace/PermGen | 類載入多 (Spring、動態代理) 易爆 PermGen/Metaspace,需額外配額 |
| 開發/測試/生產用同樣參數 | 各環境依負載、資料量調整,生產環境嚴格壓測後定案 |
**JVM 記憶體參數必須小於實體可用記憶體** 是鐵律。遇到 `Could not reserve enough space for object heap`,第一時間檢查 `free -m`、修正 `-Xms/-Xmx` 為合理值 (建議實體 RAM 50-70%),並配套調整 NewSize、Metaspace、GC 策略。生產環境務必建立 GC 日誌與監控體系,讓記憶體管理可視化、可預測。