it-swarm-ja.com

Ubuntuサーバーのプロセスに割り当てられるメモリを増やすにはどうすればよいですか?

並行性の高いメッセージングサーバーをセットアップしようとしていますが、大量のメモリを使用しているようです。現在、サーバーOSはUbuntuで、サーバーソフトウェアはJavaで記述されています。負荷がかかるとメモリ不足の例外が発生しますが、8GB RAMの70%しか使用されていません。

Javaプロセスにより多くのメモリを割り当てるにはどうすればよいですか?

1
GeeKay

私の知る限り、4つの可能性があります。

  1. Ubuntuはデフォルトでプロセスごとのメモリを制限しませんが、それらの制限を設定する方法があります。何が行われたかを知る最も簡単な方法は(もしあれば)、サーバーを管理する人に相談することです。

  2. 実際のサーバーではなくVPSを使用している場合は、VMの構成に問題がある可能性があります。

  3. Javaがどのように機能するかは正確にはわかりませんが、Cはコンパイル時にスタックで使用可能なメモリを制限します。この場合、スタックサイズを増やすか、より大きな配列を移動するようにコンパイラに指示できます。ヒープに。

  4. OSが32ビットの場合、プロセスごとに使用可能なメモリはハード制限されます(2GBから4GBの間)。サーバーに64ビットCPUが搭載されている場合は、64ビットOSをインストールすることで簡単に修正できます。

可能性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を除外します。

3
Dennis

Javaプロセスで使用される最大のメモリはヒープであり、ほとんどのJavaオブジェクトが格納されます。デフォルトでは、1GBまたはその一部に制限されています。メモリが存在します。ヒープスペースが不足すると、Javaメモリ不足の例外が発生します。-Xmxオプションを使用して、JVMのヒープのサイズを増やす(または減らす)ことができます)例:

Java -Xmx=2048m ...

32ビットJVMを使用している場合、2.5〜3GBを超えて確実に設定することはできません。この制限を回避するには、64ビットJVMに切り替える必要があります。

0
jlliagre