在Java线程转储中,您可以看到堆栈跟踪中提到的锁。 似乎有三种信息: 1: – locked <0x00002aab329f7fa0> (a java.io.BufferedInputStream) 2: – waiting to lock <0x00002aaaf4ff6fa0> (a org.alfresco.repo.lock.LockServiceImpl) 3: – parking to wait for <0x00002aaafbf70bb8> (a java.util.concurrent.SynchronousQueue$TransferStack) 1:线程已获得对象0x00002aab329f7fa0的locking。 2&3:似乎说线程正在等待所述对象的locking变为可用… 但是2和3有什么区别?
我正在运行Ubuntu服务器版,我想要采取一个Tomcat的线程转储。 所以,我第一次试图找出哪个PID tomcat使用: $ jps -l 5809 sun.tools.jps.Jps 但它不在? 所以,我用top来找出PID 5730。 然后我调用jstack来获取线程转储: $ sudo jstack -l 5730 5730: Unable to open socket file: target process not responding or HotSpot VM not loaded The -F option can be used when the target process is not responding 这是怎么回事? 🙁 我已经尝试导出CATALINA_TMPDIR Jstack和Jstat中所述停止升级到JDK6u23,但是这并没有改变任何东西: $ export CATALINA_TMPDIR=/tmp $ sudo /etc/init.d/tomcat6 […]
当Java应用程序挂起时,您甚至不知道导致此问题的用例并希望进行调查,我知道线程转储可能很有用。 但是我们怎样才能从线程转储中轻松地获取有用的数据来找出问题所在? 我一直在使用的服务器应用程序产生了非常长的线程转储,因为它是一个EJB体系结构,线程转储包含许多容器线程,我不知道应该看看(即线程不运行我的应用程序代码,但是JBoss的代码)。 昨天我尝试了线程转储分析工具。 该工具肯定比在文本编辑器中查看原始线程转储更好,因为您可以筛选出您不感兴趣的线程,查看线程列表,单击某个线程以查看其详细信息,比较线程转储以查找长时间运行的线程等。见下面的截图: 但是仍然有太多的数据需要分析 – 几乎有300个线程。 我不知道有什么标准可以用来过滤所有的JBoss线程,我不感兴趣。 我不确定是否应该只查看当前处于“可运行”状态的线程,或者“等待条件”和“Object.wait”中的线程也很重要。 你通常会遵循什么样的方法,以及一般使用的工具?
我有一个Java应用程序,我从一个控制台运行,这又是另一个Java进程。 我想获得该subprocess的线程/堆转储。 在Unix上,我可以做一个“杀-3”,但在Windows AFAIK获得线程转储的唯一方法是控制台中的Ctrl-Break。 但这只能给我父母的过程,而不是孩子的转储。 有没有另一种方法来获得堆转储?