我注意到有一些卡住了。
我想根据下面的线程转储日志来检查卡住线程的原因是什么。有人建议吗?还有一个胖锁和一个瘦锁之间的区别是什么?
"[STUCK] ExecuteThread: '25' for queue: 'weblogic.kernel.Default (self-tuning)'" id=87495 idx=0x274 tid=15308 prio=1 alive, in native, blocked, daemon
-- Blocked trying to get lock: com/jnn/testController@0x135a26c0[thin lock]
答案 0 :(得分:2)
单独一组线程转储对于找到根本原因不会太有帮助。每组之间以5秒的间隔进行4或5组线程转储。所以最后你会得到一个日志文件,在app服务器上有大约20-25秒的动作。
然后你应该寻找你想检查是一个卡住的线程还是长时间运行的事务正在发生,所有的线程转储都会显示某个线程id在你的java堆栈跟踪的同一行。简单来说,事务(比如在EJB或数据库中)跨越多个线程转储,因此需要更多的调查。
现在,当您通过Samurai或TDA(我自己没有使用过TDA)运行这些内容时,它会以红色突出显示这些颜色,以便您可以快速点击它并转到显示问题的行。
查看this here的示例。查看该链接中的Samurai输出图像。绿色很好。红色和灰色需要看。
在您的情况下,线程25被阻止尝试获取此对象的锁定
com/jnn/testController@0x135a26c0
搜索锁的其余部分以查看对同一对象持有锁的内容,并查看它为什么不释放锁 - 这将在堆栈跟踪中可见
答案 1 :(得分:0)
“瘦锁”是没有争用的锁(当线程在获取锁之前必须等待时会发生争用)。 当存在争用时,精简锁被提升为“胖锁”,并且所有线程都在等待获取锁定。
你可以在这里阅读更多关于这个论点: http://download.oracle.com/docs/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/thread_basics.html