故障诊断学习工具:在实践中学习 WebSphere 应用服务器故障诊断
2010-07-19 00:00:00 来源:WEB开发网监控线程运行情况
展开“Monitors”面板,可以看到 3 个 tab 页, 分别用来监控线程信息、内存和 cpu 使用情况以及请求的平均响应时间。 这里我们主要关心线程的运行情况,从线程信息页我们可以看到刚刚运行的两个新的线程都处于“block”状态,并且这种状态会一直持续下去。 这就是死锁,它不但导致发生死锁的两个线程无法正常结束,这两个线程所占用的资源还会影响到更多的线程, 当线程总数超过 Web Container 线程池的最大线程数时,则所有的请求都会被拒绝。
图 7. 监控运行情况
察看正确代码
用鼠标右键单击 "Correct Jsp" 按钮,在快捷菜单中选择 "Edit Action Button",在弹出的 Java 编辑器中我们可以查看或者编辑这个按钮所执行的 Java 代码,其代码如下:
清单 2.“Correct Jsp” 按钮执行的 Java 代码
synchronized (lock1) { // lock1 is defined in the "Methods and Static Variables" tab
Thread.sleep(5000);
ThreadMonitor.registerThreadStatus("blocked");
synchronized (lock2) {
ThreadMonitor.registerThreadStatus("running");
}
}
synchronized (lock1) { // lock2 is defined in the "Methods and Static Variables" tab
Thread.sleep(5000);
ThreadMonitor.registerThreadStatus("blocked");
synchronized (lock2) {
ThreadMonitor.registerThreadStatus("running");
}
}
这段代码主要完成如下操作:
获取一个全局锁 locker1
(Sleep(5000))
获取一个全局锁 locker2
释放全局锁 locker2
释放全局锁 locker1
获取一个全局锁 locker1
(Sleep(5000))
获取一个全局锁 locker2
释放全局锁 locker2
释放全局锁 locker1
与 “DeadLock Jsp” 相比,我们在这段代码中仅仅调整了一下 locker1 和 locker2 的嵌套顺序,但当我们用两个(或者更多)客户端同时发出请求时,所有线程都能够正常结束。
因此,在多线程环境下,一定要保证锁的嵌套顺序是一致的,这样才能避免死锁的发生。
结束语
除了死锁问题之外,PDLT 还包含很多其他常见的典型问题,比如 Java 内存溢出、本地内存溢出、CPU 使用率过高、连接泄漏等。 对于这些常见的错误,用户最好在问题发生之前就对它进行了解,了解这些问题发生时系统的症状,以及如何诊断和解决这类问题。这样当真正的问题到来的时候才能迅速做出判断,从而减少由于系统中断而带来的损失。
更多精彩
赞助商链接