
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)に設定する必要があります。