我们有一个java客户机/服务器应用程序,它的GUI经常(每半小时)平均在2到10秒内变得无响应。点击不同的按钮只会在几秒钟的挂起时间后生效。
我一开始以为是GC问题,但调查证明这边没有问题。
我更确信这是一个线程问题,与图形线程阻塞在某些时刻。
我如何在日志中检查图形线程的状态以见证其"无响应"?我想我可以每隔一秒左右从不同的线程检查它的状态,但是怎么做呢?要轮询哪个变量
关于如何解决这个问题还有其他想法吗?
谢谢
您可以向Java进程发出kill -QUIT
(以及在Windows上等效的东西),这将导致所有线程将它们的堆栈跟踪转储到STDOUT,因此您可以看到正在发生什么。这还显示了哪些线程持有锁(同步块),哪些线程正在等待。
如果你不能在测试中重现问题,也不能关闭生产,那么你的问题就没有一个简单的答案。
看起来你可能有更大的问题,必须使用某种分析工具来诊断。我们使用JProbe &JProfiler和我都很幸运。
最坏的情况是,您可以使用JMX编写自己的代码,按照该链接的内容执行某些操作。过去它对我很有用。
http://www.javamex.com/tutorials/profiling/profiling_java5_threads_methodology.shtml要了解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");
}
});
}