如何增加分配給 Ubuntu 伺服器中進程的記憶體

如何增加分配給 Ubuntu 伺服器中進程的記憶體

我正在嘗試設定一個高度並發的消息伺服器,它似乎使用了大量記憶體。目前我們的伺服器作業系統是Ubuntu,伺服器軟體是用Java寫的。在負載下,我們遇到記憶體不足異常,但我的 8GB RAM 只使用了 70%。

如何為 Java 進程分配更多記憶體?

答案1

據我所知,有四種可能:

  1. 預設情況下,Ubuntu 不限制每個進程的內存,但有一些方法可以設定這些限制。了解已完成操作(如果有)的最簡單方法是諮詢管理伺服器的人員。

  2. 如果您使用的是 VPS 而不是實際的伺服器,則虛擬機器的配置可能有問題。

  3. 我不知道Java到底是如何運作的,但是C在編譯時限制了堆疊可用的記憶體。在這種情況下,您可以指示編譯器增加堆疊大小或將更大的陣列移至堆疊。

  4. 如果您的作業系統是 32 位,則每個進程的可用記憶體受到硬限制(2 GB 到 4 GB 之間)。如果您的伺服器具有 64 位元 CPU,則可以透過安裝 64 位元作業系統輕鬆修復該問題。

可能性4很容易排除。要驗證它是 1、2 還是 3,您可以使用 gcc 編譯以下內容(或用 Java 編寫等效內容):

#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv)
{
    long bytes = atol(argv[1]), counter, *pointer, words = bytes / sizeof(long);

    // try to allocate memory

    if ((pointer = malloc(bytes)) == NULL)
    {
        puts("Could not allocate memory");
        exit(1);
    }

    // play with memory, so compiler won't optimize allocation out

    for(counter = 0; counter < words; counter++)
        pointer[counter] = counter;

    exit(0);
}

並執行您想要作為命令列選項分配的記憶體量。

您應該能夠分配所有報告為空閒或快取的記憶體。如果可以的話,您可以排除可能性 1 和可能性 2。

答案2

java行程使用的最大記憶體是堆,大多數java物件都儲存在堆中。預設情況下,它限制為 1 GB 或現有記憶體的一小部分。當堆空間不足時,就會出現 java 記憶體不足異常。您可以使用 -Xmx 選項增加(或減少)JVM 堆的大小。例如:

java -Xmx=2048m ...

如果您使用的是 32 位元 JVM,則無法可靠地將其設定為超過 ~2.5 到 3 GB。您需要切換到 64 位元 JVM 才能避免此限制。

相關內容