java程序在到達xmx之前記憶體不足
在 Redhat CentOS 6.4 上只有幾個程序在執行,使用大約 3GB RAM(系統有 12GB 可用)。其中一個程序是 WSO2ESB 伺服器 (java),我們使用以下參數啟動它:
-Xms2048m -Xmx3072m
過了一會兒,我們得到了 OutOfMemory 異常,但是java 程序(WSO2ESB)程序甚至沒有使用它的 3GB。在 jconsole 中,您還可以看到這些參數設置正確(此時 Linux 伺服器有大約 9GB 的可用 RAM)
Linux 沒有給我們配置的 3 GByte RAM 嗎?
在完全相同的 Windows 安裝上 - java 程序可以毫無問題地使用它的 3GB Ram。
jconsole 的螢幕截圖顯示僅在 0.3 和 1.0 GB 之間的堆記憶體使用情況。在 OutOfMemory 異常的時刻,堆記憶體為 0.5GB,但該程序將有 3GB 可用,但它沒有……
編輯:添加了 java 程序的日誌:
java.lang.OutOfMemoryError: unable to create new native thread
EDIT2:添加免費 -m 輸出:
我解決了這個問題。wso2esb 使用了 1000 多個執行緒。但是在 linux 上,使用者可以使用的預設執行緒數設置為 1024。我不得不提高我的使用者的限制,現在一切正常。
為此:打開 /etc/security/limits.conf 並為您的使用者添加以下兩行:
myuser soft nproc 8192 myuser hard nproc 8192
Java有多代堆空間,新的、舊的永久代。
如果你把 Xmx 設置得很高,那是用來堆的,即使你不使用整個堆,也可能會耗盡記憶體。如果 PermGen 空間不足,通常會發生這種情況。
堆的永久生成用於儲存String pool和JVM需要的與Class、method等java原語相關的各種Meta數據。Perm 空間通常是 64MB,所以如果你有很多類或巨大的字元串,你可能會用完它。
嘗試通過添加以下內容來增加 permgen 大小:
-XX:MaxPermSize=256m
到您的 java 啟動選項。