我正在處理一個遺留項目,其中有人使用了擺動計時器線程來執行一些服務器調度任務。這段代碼不是一個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)
什麼是「空載暫停」? – jtahlborn
對不起,沒有看到你的問題,所以認爲我會完整地回答,但我們看到計時器線程的日誌消息在預定的時間間隔觸發。但是每隔幾分鐘,它就會暫停30秒。我們似乎已經確定VM線程佔用了大部分的CPU,在這個暫停期間。但是運行詳細的gc,在那段時間內我們看不到任何gc活動。 –