同時実行性の高いメッセージング サーバーをセットアップしようとしていますが、大量のメモリを使用しているようです。現在、サーバー OS は Ubuntu で、サーバー ソフトウェアは Java で書かれています。負荷がかかるとメモリ不足の例外が発生しますが、8 GB の RAM の 70% しか使用されていません。
Java プロセスにさらにメモリを割り当てるにはどうすればよいですか?
答え1
私の知る限り、4つの可能性があります:
Ubuntu はデフォルトではプロセスごとのメモリを制限しませんが、その制限を設定する方法はあります。何が行われたか (行われた場合) を知る最も簡単な方法は、サーバー管理者に相談することです。
実際のサーバーではなく VPS を使用している場合は、VM の構成に問題がある可能性があります。
Java がどのように動作するかは正確にはわかりませんが、C ではコンパイル時にスタックに使用できるメモリが制限されます。この場合、コンパイラにスタック サイズを増やすように指示するか、大きな配列をヒープに移動することができます。
OS が 32 ビットの場合、プロセスごとに使用可能なメモリは厳密に制限されます (2 GB から 4 GB の間)。サーバーに 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 を除外できます。
答え2
Java プロセスによって使用される最大のメモリはヒープです。ヒープには、ほとんどの Java オブジェクトが格納されます。デフォルトでは、1 GB または存在するメモリの一部に制限されます。ヒープ領域が不足すると、Java のメモリ不足例外が発生します。-Xmx オプションを使用して、JVM のヒープ サイズを増やす (または減らす) ことができます。例:
java -Xmx=2048m ...
32 ビット JVM を使用している場合、確実に 2.5 ~ 3 GB を超える値に設定することはできません。この制限を回避するには、64 ビット JVM に切り替える必要があります。