質問

JBoss 5を実行しています。時間が経過するにつれてメモリキープが増加していることがわかります。 アクティブなスレッドの数は増加しています。次のスタックトレースは、多数のスレッドのうちの1つであるアクティブなスレッドから取得されます(これらは、時間の経過として追加されているスレッドです)。 スタックトレースから何を学ぶことができますか?どうすればより深く、現在の状況をより明確に把握できますか?

名前:WorkManager(2)-92 状態:java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@4e2e52で待機中 ブロックされた合計:1待機された合計:1

スタックトレース: sun.misc.Unsafe.park(ネイティブメソッド) java.util.concurrent.locks.LockSupport.park(LockSupport.java:158) java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject.await(AbstractQueuedSynchronizer.java:1925) java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:358) java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947) java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:907) java.lang.Thread.run(Thread.java:619)

ありがとう、 ロッド

役に立ちましたか?

解決

このスレッドは、getTask()を待っているように見えます。つまり、何らかの作業が行われるのを待っているだけです。

リクエストが着信すると新しいスレッドが生成されますが、実際の作業で忙しいスレッドが大量にない限り、心配する必要はありません。

メモリ使用量は、JVMがその一部をガベージコレクションすることを決定するまで、時間とともに増加します。成長し続け、jconsoleからGCを実行しても違いがない場合は、メモリリークが発生している可能性があります。リークを見つけるのは難しい場合がありますが、 MAT を使用して簡単にすることができます。

他のヒント

JDK1.6またはJDK1.7からJConsoleを実行することで、これからさらに学ぶことができます。 JDK1.5のJConsole.exeは「古い学校」です。

jvisualvm 。ヒープ使用量、スレッド、ガベージコレクションなどの時間経過とともにグラフが表示されます。

jmapでヒープダンプを取ることもできます。 、そして jhat または mat

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