Redhat CentOS 6.4では、約3GBを使用して実行されているプロセスはごくわずかですRAM(システムには12GBが使用可能です)。プロセスの1つはWSO2ESBサーバー(Java)であり、これらのパラメーターで開始します。 :
-Xms2048m -Xmx3072m
しばらくすると、OutOfMemory例外が発生しますが、Java process(WSO2ESB)プロセスは3GBを使用していません。jconsoleでは、これらのパラメーターも確認できます。正しく設定されている場合(Linuxサーバーには約9GBの空き容量がありますRAMこの時点で)
Linuxは構成済みの3ギガバイトのRAMを提供しませんか?
まったく同じWindowsインストールで-Javaプロセスは、3GBのRAMを問題なく使用できます。
0.3〜1.0GBのヒープメモリ使用量のみを示すjconsoleのスクリーンショット。 OutOfMemory例外の時点で、ヒープメモリは0.5GBでしたが、プロセスには3GBが必要ですが、そうではありません...
編集:Javaプロセスのログを追加:
Java.lang.OutOfMemoryError: unable to create new native thread
EDIT2:無料の-m出力を追加:
私は問題を解決しました。 wso2esbは1000を超えるスレッドを使用していました。しかし、Linuxでは、ユーザーが使用できるスレッドのデフォルトの量は1024に設定されています。ユーザーの制限を引き上げる必要がありました。これですべてが正常に機能します。
これを行うには:/etc/security/limits.confを開き、ユーザーに次の2行を追加します。
myuser soft nproc 8192
myuser hard nproc 8192
Javaには、複数世代のヒープスペース、新しい、古い永続的な世代があります。
ヒープに使用される非常に高いXmxを設定すると、ヒープ全体を使用しなくても、メモリが不足する可能性があります。これは通常、PermGenスペースが不足した場合に発生します。
ヒープの永続的な生成は、クラス、メソッド、その他のJavaプリミティブに関連するJVMに必要な文字列プールとさまざまなメタデータを格納するために使用されます。パーマスペースは通常64MBなので、クラスが多い場合、またはあなたがそれを使い果たすことができる巨大な文字列。
次を追加して、permgenサイズを増やしてみてください。
-XX:MaxPermSize=256m
Java起動オプションに。
ヒープのデータセグメントサイズは何ですか-Xms2048m -Xmx3072m
。
データセグメントサイズは、最大ヒープサイズ(この場合は3072m)に対応している必要があります。したがって、データセグメントサイズは少なくとも3221225472
に設定する必要があります(バイト数3 * 1024 * 1024 * 1024 = 3GB)