2012-10-04 34 views
2

我正在處理一個遺留項目,其中有人使用了擺動計時器線程來執行一些服務器調度任務。這段代碼不是一個swing應用程序,它是服務器端的java。我知道這不是一個好主意,並且知道可以接受的方法來做同樣的事情。問題是,我看到一些虛擬機暫停在空閒時間內每隔幾分鐘就會發生一次。啓用verbose gc,我確定它不是垃圾收集。當我在其中一次暫停時執行線程轉儲時,我在下面得到這個轉儲。任何想法,如果這個AWTAutoShutdown可能導致這個暫停,或者它在做什麼,當它執行下面顯示的activateBlockerThread?AWTAutoShutdown線程暫停虛擬機

"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) 
+0

什麼是「空載暫停」? – jtahlborn

+0

對不起,沒有看到你的問題,所以認爲我會完整地回答,但我們看到計時器線程的日誌消息在預定的時間間隔觸發。但是每隔幾分鐘,它就會暫停30秒。我們似乎已經確定VM線程佔用了大部分的CPU,在這個暫停期間。但是運行詳細的gc,在那段時間內我們看不到任何gc活動。 –

回答

1

看起來您可能會遇到通知問題。 TimerQueue線程應該在AWT關閉線程啓動後喚醒(AWTAutShutdown.run方法向監視器發出AWTAutShutdown.activateBlockerThread方法正在等待的信號)。如果您的應用程序長時間處於凍結狀態,並且這些線程沒有取得進展,則看起來TimerQueue線程沒有及時接收信號。

然而,看到你的應用程序是而不是一個swing/awt應用程序,我不明白這將如何影響應用程序中的其他任何內容。

+0

Timer正在使用ActionListener構造,並且如果該偵聽器的actionPerformed方法在調用時需要很長時間才能完成,那會導致它們備份? –

+0

@AlperAkture - 是的,擺動定時器都在同一個線程上執行,所以一個長時間的任務將阻止所有其他線程。 – jtahlborn

+0

我們正在觀看其中一位定時器的日誌消息。它每三秒輸出一次,但會定期停止長達30秒。所以它必須由一些其他Timer執行,如你所說。我們認爲我們認爲佔用CPU的線程(使用top和線程ID)似乎是:「VM Thread」prio = 10 tid = 0x00000000415ff000 nid = 0x2a16 runnable,它沒有跟蹤。但我想你回答了我的問題,謝謝! –