質問

サーバーの過負荷をシミュレートしていると、次のエラーが発生します。

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

このページで読みました http://activemq.apache.org/javalangoutofmemory.html, 、メモリサイズを増やすことができるということです。しかし、どうすればよいでしょうか?どのファイルを変更する必要がありますか?bin/activemq スクリプトで引数を渡そうとしましたが、うまくいきませんでした。

役に立ちましたか?

解決

あなたのケースは、大量のスレッドに対応しています。 解決するには3つの方法があります:

  • ドキュメント内のスレッド数を減らす(つまり、 -Dorg.apache.activemq.UseDedicatedTaskRunner = false
  • -Xss オプションによるスレッドごとのスタックサイズの縮小(デフォルト値:Win / Linux上の32ビットJavaの場合は320 KiB、Win / Linuxの64ビットJavaの場合は1024 KiB、< a href = "http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#threads_oom" rel = "nofollow noreferrer"> doc )
  • ヒープサイズを縮小(拡張)する -Xmx オプションは、スレッドごとのスタック用のスペースを確保します(ActiveMQスクリプトではデフォルトで512 MiB)

:スタックまたはヒープが小さすぎる場合、別の OutOfMemoryError が発生する必要があります。

ACTIVEMQ_OPTS シェル変数(UNIXの場合)を使用して指定できます。 たとえば、ActiveMQを次のように実行します

ACTIVEMQ_OPTS=-Xss160k bin/activemq

他のヒント

ここをチェック

ActiveMQを実行しているVM、たとえばTomcatに -Xmx 引数を指定します。

-Xmx コマンド引数を使用して、Java仮想マシンにさらにメモリを割り当てることができます。
例えば。 java -Xmx512M MyClass

Linux(RedHat Enterprise 5)システムでこの問題に遭遇し、このビルドで /etc/security/limits.conf のnprocs ulimitが実際にスレッドの数を制御することを発見しました。ユーザーはスポーンできます。

ulimit -a コマンドを使用して、この制限を表示できます。

デフォルトでは、これは100のソフト制限と150のハード制限に設定されていました。これは、最新のApp Serverを実行するために必要なスレッドの数にひどく不足しています。
この制限をすべて削除し、この問題を解決しました。

ヒープ領域が不足しているようには見えないため、ヒープ領域を増やさないでください (-Xmx オプション)。代わりに、アプリケーションのプロセス メモリが不足しており、 減少する ヒープ スペースにより、ネイティブ使用のためにプロセス メモリが解放されます。問題は、なぜこれほど多くのプロセス メモリを使用するのかということです。JNI を使用しない場合は、作成したスレッドが多すぎる可能性があります。habe の投稿では、それを修正する方法が説明されています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top