我们有一个泄漏了一点内存的应用程序,有点轻描淡写。
我正在使用jstack来尝试查找导致问题的原因。
我看到线程数在以名称开头的线程上增长了很多:http-8080-42
示例:
" HTTP-8080-13" daemon prio = 10 tid = 0x00002aacb4ae6000 nid = 0x5ddf等待监视器输入[0x0000000043e65000] java.lang.Thread.State:BLOCKED(在对象监视器上) at com.reg_dashboard.DataModel.findRegsRow(DataModel.java:280) - 等待锁定< 0x00002aaab0c996b0> (com.reg_dashboard.DataModel的java.lang.Class)
我的第一个猜测是,这些线程中的每一个都是来自客户端的请求命中,并且它等待某种同步块。 我的问题是那些线程已经运行了很长一段时间(到目前为止10分钟)。
我的问题是:
有没有办法杀死这个导致我的应用程序挂起的线程???有一些请求正在加载catche并卡住了,其他进程正在等待对象解锁!
答案 0 :(得分:1)
有没有办法杀死导致我的应用程序的这个线程 要挂?
非常不可能。底层JVM实现应该知道当外部进程杀死其中一个线程时如何做出反应。您可能会将VM置于不一致状态。
你已经知道死锁的位置。较新的VM几乎可以告诉您哪些线程彼此死锁。解决问题的来源,而不是试图杀死线程。谁能说杀死锁定线程后10秒内线程不会死锁(假设它甚至可以工作)。
如果您想深入了解应用程序中的锁定机制,我建议您使用JProfiler之类的工具。您可以更快地解决问题。我指的是Monitor profiling
部分。