web-dev-qa-db-ja.com

java xmxに到達する前にプログラムのメモリが不足しています

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を問題なく使用できます。

enter image description here0.3〜1.0GBのヒープメモリ使用量のみを示すjconsoleのスクリーンショット。 OutOfMemory例外の時点で、ヒープメモリは0.5GBでしたが、プロセスには3GBが必要ですが、そうではありません...

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

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

EDIT2:無料の-m出力を追加: enter image description here

3
Darkpara

私は問題を解決しました。 wso2esbは1000を超えるスレッドを使用していました。しかし、Linuxでは、ユーザーが使用できるスレッドのデフォルトの量は1024に設定されています。ユーザーの制限を引き上げる必要がありました。これですべてが正常に機能します。

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

myuser             soft    nproc           8192
myuser             hard    nproc           8192

enter image description here

2
Darkpara

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

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

ヒープの永続的な生成は、クラス、メソッド、その他のJavaプリミティブに関連するJVMに必要な文字列プールとさまざまなメタデータを格納するために使用されます。パーマスペースは通常64MBなので、クラスが多い場合、またはあなたがそれを使い果たすことができる巨大な文字列。

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

-XX:MaxPermSize=256m

Java起動オプションに。

1
Jakov Sosic

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

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

0
SonalKhodiyar