Linux

java程序在到達xmx之前記憶體不足

  • November 26, 2014

在 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 啟動選項。

引用自:https://serverfault.com/questions/646932