2012-10-04 35 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,它没有跟踪。但我想你回答了我的问题,谢谢! –