Tag: thread dump

jstack是否停止使用较新的JDK8版本?

我很惊讶地发现,不知怎的,最近,jstack停止了在更新的JDK 8上工作。我不知道发生了哪个版本,但我得到了: 36649: 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 ps -Af|grep 36649 conflue+ 36649 1 62 08:14 ? 00:48:28 /usr/lib/jvm/java-8-oracle/bin/java -Djava.util.logging.config.file=/opt/atlassian/confluence/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms15000m -Xmx15000m -Duser.timezone=UTC -Djava.awt.headless=true -Dconfluence.upgrade.recovery.file.enabled=false -Dmail.smtp.connectiontimeout=10000 -Dmail.smtp.timeout=10000 -XX:MaxMetaspaceSize=256m -XX:+UseG1GC -Djava.awt.headless=true -Xloggc:/opt/atlassian/confluence/logs/gc-2015-07-02_08-14-39.log -XX:+UseGCLogFileRotation […]

Tomcat线程转储

有没有从Tomcat采取线程转储 。 我想在某个时间监视Tomcat上正在运行的线程。 注意:我在Web逻辑上这样做但我不知道如何在Tomcat上完成它。

当JVM在GC中花费时间时,线程转储是什么样的

在分析Java应用程序时,我注意到有趣的事实。 当JVM处于死亡线程转储的GC螺旋时,它看起来像: “1304802943@qtp-393978767-9985” prio=10 tid=0x00007f3ed02dd000 nid=0x74e7 in Object.wait() [0x000000004febb000] java.lang.Thread.State: TIMED_WAITING (on object monitor) at java.lang.Object.wait(Native Method) at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:626) – locked (a org.mortbay.thread.QueuedThreadPool$PoolThread) “26774405@qtp-393978767-9984” prio=10 tid=0x00007f3ee4b37000 nid=0x74e6 in Object.wait() [0x0000000045d1a000] java.lang.Thread.State: TIMED_WAITING (on object monitor) at java.lang.Object.wait(Native Method) at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:626) – locked (a org.mortbay.thread.QueuedThreadPool$PoolThread) “764808089@qtp-393978767-9983” prio=10 tid=0x00007f3ee4c50000 nid=0x74e5 in Object.wait() [0x000000004ad6a000] java.lang.Thread.State: TIMED_WAITING (on object […]

tomcat中有100个线程TIMED_WAITING,导致它在线程总数超过200时停止

最近我们的一个生产tomcat服务器没有响应,因为tomcat的繁忙线程高达200.当我们在重新启动之前进行线程转储时,我们在TIMED_WAITING状态下获得了100个线程,就像这3个线程一样: “”http-bio-7007″-exec-241” daemon prio=10 tid=0x00002aaab107b000 nid=0x59df waiting on condition [0x0000000051239000] java.lang.Thread.State: TIMED_WAITING (parking) at sun.misc.Unsafe.park(Native Method) – parking to wait for (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2025) at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:424) at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:86) at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:32) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:945) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) at java.lang.Thread.run(Thread.java:662) “”http-bio-7007″-exec-237” daemon prio=10 tid=0x00002aaab186e000 nid=0x596d waiting on condition [0x000000004d1f9000] java.lang.Thread.State: TIMED_WAITING (parking) at sun.misc.Unsafe.park(Native Method) – […]

在生产中进行线程转储

我正在分析获取线程转储的方法之间的差异。 以下是我正在研究的几个人 定义一个jmx bean,它在单击声明的bean操作时通过Runtime.exec()触发jstack。 守护程序线程在预定义的时间间隔后重复执行“ManagementFactory.getThreadMXBean()。dumpAllThreads(true,true)”。 比较两者之间的线程转储输出,我在方法2中看到了以下缺点 使用方法2记录的线程转储无法由TDA等开源线程转储分析器解析 输出不包括本机线程ID,它可用于分析高CPU问题(对吗?) 还有吗? 我很感激获得建议/意见 在生产代码中通过Runtime.exec()执行jstack是否有任何缺点? 各种操作系统上的兼容性问题 – windows,linux? 采取线程转储的任何其他方法? 谢谢。 编辑 – 1和2的组合方法似乎是要走的路。 我们可以在后台运行专用线程,并以线程转储分析器可以理解的格式在日志文件中打印线程转储。 如果需要任何额外的信息(比如说可能是本机线程id)只能由jstack输出记录,我们会根据需要手动执行。

如何调试Java OutOfMemoryexception?

调试java.lang.OutOfMemoryErrorexception的最佳方法是什么? 当我们的应用程序发生这种情况时,我们的应用服务器(Weblogic)会生成堆转储文件。 我们应该使用堆转储文件吗? 我们应该生成Java线程转储吗? 究竟有什么区别? 更新:生成线程转储的最佳方法是什么? kill -3 (我们的应用程序在Solaris上运行)是杀死应用程序并生成线程转储的最佳方法吗? 有没有办法生成线程转储但不杀死应用程序?

Java线程转储:没有“等待锁定……”的BLOCKED线程

我在理解我从jstack获得的线程转储有困难,因为在Tomcat 6上运行的Spring MVC Web应用程序(java 1.6.0_22,Linux)。 我看到阻塞线程(导致其他线程等待)自己被阻塞,但是线程转储没有告诉我为什么或者他们正在等待哪个监视器。 例: “TP-Processor75” daemon prio=10 tid=0x00007f3e88448800 nid=0x56f5 waiting for monitor entry [0x00000000472bc000] java.lang.Thread.State: BLOCKED (on object monitor) at java.lang.Class.initAnnotationsIfNecessary(Class.java:3067) – locked (a java.lang.Class for org.catapultframework.resource.ResourceObject) at java.lang.Class.getAnnotation(Class.java:3029) … 即我错过了堆栈跟踪中的“等待锁定…”行。 显然线程锁定了一个Class对象,但是我不明白为什么线程本身被阻塞了。 线程转储不包含任何死锁提示。 如何识别锁定监视器? 谢谢,奥利弗

以编程方式进行线程转储/ JDI(Java调试器接口)

我喜欢以编程方式生成线程转储。 我已经了解到基本上有两种方法可以做到: 使用“Java虚拟机工具接口”JVM-TI 使用更高抽象的“Java调试器接口”JDI 对于JVM-TI,我能够找到一些有用的信息,但我必须编写一个JNI-DLL,至少在目前,我想避免使用它。 使用JDI,我可以使用Java,似乎我可以在应用程序中使用它。 但我无法找到某种教程或HOWTO。 我能找到的唯一文件是Java-Docs http://java.sun.com/j2se/1.5.0/docs/guide/jpda/jdi/ ,这对我没有帮助,因为它没有给我看如何使用这个类。 那么,有没有人知道我能阅读的好教程/书? 感谢任何帮助!