2

私は、誰かがサーバー スケジューリング タスクを実行するためにスイング タイマー スレッドを使用していたレガシー プロジェクトに取り組んでいます。このコードはスイング アプリではなく、サーバー側の Java です。私はこれが良い考えではないことを知っており、同じことを行うための受け入れ可能な方法を知っています. 問題は、負荷のない状態で数分ごとに長い VM の一時停止が発生することです。verbose gc を有効にして、ガベージ コレクションではないと判断しました。これらの一時停止中にスレッド ダンプを実行すると、以下のダンプが得られます。この AWTAutoShutdown がこの一時停止を引き起こしている可能性があるかどうか、または以下に示す activateBlockerThread を実行するときに何をしているのか、何か考えはありますか?

"AWT-Shutdown" prio=10 tid=0x00007fed5802d000 nid=0x2ef1 in Object.wait() [0x00007fed53e5d000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x000000031e910b90> (a java.lang.Object)
at java.lang.Object.wait(Object.java:485)
at sun.awt.AWTAutoShutdown.run(Unknown Source)
- locked <0x000000031e910b90> (a java.lang.Object)
at java.lang.Thread.run(Unknown Source)

"TimerQueue" daemon prio=10 tid=0x00007fed58597000 nid=0x2a56 in Object.wait() [0x00007fed54737000]
java.lang.Thread.State: BLOCKED (on object monitor)
   at java.lang.Object.wait(Native Method)
   - waiting on <0x000000031e910b90> (a java.lang.Object)
   at java.lang.Object.wait(Object.java:485)
   at sun.awt.AWTAutoShutdown.activateBlockerThread(Unknown Source)
   at sun.awt.AWTAutoShutdown.notifyThreadBusy(Unknown Source)
   - locked <0x000000031e910b90> (a java.lang.Object)
   - locked <0x000000031e9a60c8> (a java.lang.Object)
   at java.awt.EventQueue.postEvent(Unknown Source)
   at java.awt.EventQueue.postEventPrivate(Unknown Source)
   - locked <0x000000031e90eb90> (a java.awt.EventQueue)
   at java.awt.EventQueue.postEvent(Unknown Source)
   at java.awt.EventQueue.invokeLater(Unknown Source)
   at javax.swing.SwingUtilities.invokeLater(Unknown Source)
   at javax.swing.Timer$1.run(Unknown Source)
   at javax.swing.Timer$1.run(Unknown Source)
   at java.security.AccessController.doPrivileged(Native Method)
   at javax.swing.Timer.post(Unknown Source)
   - locked <0x000000031e9af7e0> (a javax.swing.Timer)
   at javax.swing.TimerQueue.postExpiredTimers(Unknown Source)
   - locked <0x000000031e90ce60> (a javax.swing.TimerQueue)
   at javax.swing.TimerQueue.run(Unknown Source)
   - locked <0x000000031e90ce60> (a javax.swing.TimerQueue)
   at java.lang.Thread.run(Unknown Source)
4

1 に答える 1

1

通知に問題がある可能性があるようです。AWT-Shutdown スレッドが開始された後、TimerQueue スレッドが起動しているはずです (AWTAutShutdown.run メソッドは、AWTAutShutdown.activateBlockerThread メソッドが待機していることをモニターに通知します)。アプリが長時間フリーズし、これらのスレッドが進行していない場合、TimerQueue スレッドがシグナルをタイムリーに受信していないように見えます。

ただし、あなたのアプリケーションはswing/awtアプリケーションではないので、これがアプリケーションの他のものにどのように影響するかわかりません

于 2012-10-04T19:30:01.657 に答える