![Ubuntu 14 JVM - 無法為卡片標記陣列保留足夠的空間](https://rvso.com/image/1083717/Ubuntu%2014%20JVM%20-%20%E7%84%A1%E6%B3%95%E7%82%BA%E5%8D%A1%E7%89%87%E6%A8%99%E8%A8%98%E9%99%A3%E5%88%97%E4%BF%9D%E7%95%99%E8%B6%B3%E5%A4%A0%E7%9A%84%E7%A9%BA%E9%96%93.png)
升級到 Ubuntu 14 後,我遇到了所有 JVM 崩潰的問題。
我重新安裝Java(oracle和openjdk版本)。我花了一些時間調整 JVM 堆參數,現在終於可以執行 Java 應用程式了。
現在的問題是,每次啟動 SQLDeveloper 時,我的 Eclipse JVM 都會提示:「無法為卡片標記陣列保留足夠的空間」。
如果我理解正確的話,這與 JVM 記憶體區塊分配有關。
我必須遵守什麼規則才能防止這種情況發生嗎?
機器資訊:
Ubuntu 14.04 LTS; 64 位元; CPU 英特爾酷睿2雙核心; 8GB記憶體
Eclipse:java-7-oracle; -d64; -XX:MaxPermSize=256M; -Xms512m -Xmx512m;
Eclipse 運行/調試:java-6-openjdk-amd64; -Xms1024m; -Xmx1024公尺; -XX:+使用串行GC;
SQLDeveloper:java-7-oracle; -XX:MaxPermSize=256M;
答案1
JVM 正在嘗試分配連續的記憶體區塊。由於我係統上有足夠的內存,所以它肯定是碎片化的。
為了解決這個問題,我將初始堆大小設定得非常低(預設 128 不起作用),並允許 JVM 處理它。
我將 JVM 執行參數更改為:
java-6-openjdk-amd64; -Xms1024m; -Xmx1024m;
到:
java-6-openjdk-amd64; -Xms64m; -Xmx1024m;
更新:
我還將 overcommit_ratio 從 100(預設)降低到 50。
$ cat /proc/sys/vm/overcommit_ratio
我知道建議將其保留為 100,但由於我已經進行了更改,因此當我並行運行 Chromium/Eclipse/SQLDeveloper 時,我不會收到 jvm 錯誤。