Java プログラムが xmx に到達する前にメモリ不足になる

Java プログラムが xmx に到達する前にメモリ不足になる

Redhat CentOS 6.4 では、約 3GB の RAM を使用する少数のプロセスしか実行されていません (システムには 12GB の空きがあります)。プロセスの 1 つは WSO2ESB サーバー (java) であり、次のパラメータを使用して起動します。

 -Xms2048m -Xmx3072m

しばらくするとOutOfMemory例外が発生しますが、Javaプロセス(WSO2ESB)は3GBも使用していないjconsole では、これらのパラメータが正しく設定されていることも確認できます (この時点で Linux サーバーには約 9 GB の空き RAM があります)

Linux では構成された 3 GB の RAM が提供されないのでしょうか?

まったく同じ Windows インストールでは、Java プロセスは 3 GB の RAM を問題なく使用できます。

ここに画像の説明を入力してください ヒープ メモリ使用量が 0.3 ~ 1.0 GB の間であることを示す jconsole のスクリーンショット。OutOfMemory 例外が発生した時点でヒープ メモリは 0.5 GB でしたが、プロセスには 3 GB のメモリが使用可能ですが、そうではありません...

編集: Java プロセスのログを追加しました:

java.lang.OutOfMemoryError: unable to create new native thread

編集2: free -m 出力を追加しました: ここに画像の説明を入力してください

答え1

問題を解決しました。wso2esb は 1000 を超えるスレッドを使用していました。しかし、Linux では、ユーザーが使用できるスレッドのデフォルトの数は 1024 に設定されています。ユーザーの制限を増やす必要がありましたが、今はすべて正常に動作しています。

これを行うには、/etc/security/limits.conf を開き、ユーザーに対して次の 2 行を追加します。

myuser             soft    nproc           8192
myuser             hard    nproc           8192

ここに画像の説明を入力してください

答え2

Java には、新しい世代と古い世代の複数の世代のヒープ スペースがあります。

Xmx を非常に高く設定すると、それがヒープに使用され、ヒープ全体を使用しなくてもメモリが不足する可能性があります。これは通常、PermGen スペースが不足した場合に発生します。

ヒープの永続的生成は、クラス、メソッド、およびその他の Java プリミティブに関連して JVM に必要な文字列プールとさまざまなメタデータを格納するために使用されます。永続的スペースは通常 64 MB であるため、多数のクラスまたは巨大な文字列がある場合は、スペースが不足する可能性があります。

以下を追加して permgen サイズを増やしてみてください。

-XX:MaxPermSize=256m

Java 起動オプションに追加します。

答え3

ヒープのデータ セグメント サイズはいくらですか-Xms2048m -Xmx3072m

データセグメントサイズは最大ヒープサイズ(この場合は3072m)に対応している必要があります。したがって、データセグメントサイズは少なくとも3221225472(バイト単位で3*1024*1024*1024 = 3GB)に設定する必要があります。

関連情報