我们有一个java客户端/服务器应用程序,其中GUI有规律地(每半小时)变得平均2到10秒无响应。点击不同的按钮只有在挂起几秒钟后才会生效。
我最初以为是GC问题,但调查证明这一端没有问题。
我更确信这是一个线程问题,图形化线程有时会阻塞。
我如何检查图形线程的状态,以在我的日志中见证它的“无响应”?我想我可以从不同的线程每秒检查一次它的状态,但是怎么做呢?轮询哪个变量?
关于如何解决这个问题,还有其他的想法吗?
谢谢
发布于 2011-04-26 01:30:59
您可以向Java进程发出kill -QUIT
(在Windows上也是类似的命令),这将导致所有线程将它们的堆栈跟踪转储到STDOUT,这样您就可以看到发生了什么。这也显示了哪些线程正在持有锁(同步块),哪些线程正在等待。
发布于 2011-04-26 01:57:16
如果您不能在测试中重现问题,也不能关闭生产,那么您的问题就没有简单的答案。
看起来您可能有更大的问题,必须使用某种分析工具进行诊断。我们用的是JProbe & JProfiler,用起来很幸运。
最坏的情况是,您可以使用JMX编写您自己的代码,这些代码按照此链接的思路执行某些操作。在过去,它对我非常有用。
http://www.javamex.com/tutorials/profiling/profiling_java5_threads_methodology.shtml
发布于 2011-04-26 02:31:18
要了解UI线程被阻塞的时间有多长,可以这样做,
ScheduledThreadPoolExecutor executor = ....
executor.scheduleAtFixedRate(new Runnable(){
public void run() {testEventThread();}}, 5, 5, TimeUnit.SECONDS);
void testEventThread() {
final long now = System.currentTimeMillis();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
System.out.println("event thread took:" + (System.currentTimeMillis()- now) + " to respond");
}
});
}
https://stackoverflow.com/questions/5784990
复制