`
jobar
  • 浏览: 340804 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java中如何生成线程转储

 
阅读更多
线程转储就是在jvm中所有活动的线程的一个列表,线程转储对于分析应用程序瓶颈和死锁情况非常有帮助。
在java程序中有两种常用的方法可以让我们生成线程转储,这些方法对于linux或者Unix操作系统来说是有效的,window情况稍有不同。
1. VisualVM :
我们可以使用VisualVM很容易的为任何java程序生成线程转储。只需要在运行的java进程上点右键,选择“Thread Dump”选项来生成。



2 jstack:
java提供了自带的工具jstack,通过这个工具我们可以同样为java进程产生线程转储。通过两个步骤实现:
2.1 用“ps -eaf | grep java”命令找到java进程的PID。
2.2 用jstack PID 命令来生成线程转储到控制台,也可以用命令“jstack PID >> mydumps将输出保存到文件中mydumps中。
下面是输出的dump文件
可以从文件中看到线程转储是全部线程的罗列,每项显示了有关线程的信息,包括下面的几项信息:
线程名
线程优先级
线程ID:代表线程的唯一ID号
线程状态:提供了当前线程的状态信息,例如RUNNABLE, WAITING, BLOCKED。当分析线程死锁时查看阻塞的线程的状态跟他们获取锁相关的资源
线程调用堆栈:为线程提供了重要的堆栈信息。这儿我们可以看到线程获取锁以及它等待的锁的情况。
2014-02-25 14:23:57
Full thread dump Java HotSpot(TM) Client VM (23.25-b01 mixed mode, sharing):

"RMI TCP Connection(6)-141.206.218.103" daemon prio=6 tid=0x03d34400 nid=0xe48 runnable [0x0478f000]
   java.lang.Thread.State: RUNNABLE
	at java.net.SocketInputStream.socketRead0(Native Method)
	at java.net.SocketInputStream.read(SocketInputStream.java:150)
	at java.net.SocketInputStream.read(SocketInputStream.java:121)
	at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
	at java.io.BufferedInputStream.read(BufferedInputStream.java:254)
	- locked <0x28f543f8> (a java.io.BufferedInputStream)
	at java.io.FilterInputStream.read(FilterInputStream.java:83)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:724)

   Locked ownable synchronizers:
	- <0x28f54580> (a java.util.concurrent.ThreadPoolExecutor$Worker)

"RMI TCP Connection(5)-141.206.218.103" daemon prio=6 tid=0x03e40c00 nid=0x1f98 runnable [0x047df000]
   java.lang.Thread.State: RUNNABLE
	at java.net.SocketInputStream.socketRead0(Native Method)
	at java.net.SocketInputStream.read(SocketInputStream.java:150)
	at java.net.SocketInputStream.read(SocketInputStream.java:121)
	at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
	at java.io.BufferedInputStream.read(BufferedInputStream.java:254)
	- locked <0x28efb0a0> (a java.io.BufferedInputStream)
	at java.io.FilterInputStream.read(FilterInputStream.java:83)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:724)

   Locked ownable synchronizers:
	- <0x28e74b30> (a java.util.concurrent.ThreadPoolExecutor$Worker)

"JMX server connection timeout 16" daemon prio=6 tid=0x03e38c00 nid=0x1b84 in Object.wait() [0x043af000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x28e76e38> (a [I)
	at com.sun.jmx.remote.internal.ServerCommunicatorAdmin$Timeout.run(ServerCommunicatorAdmin.java:168)
	- locked <0x28e76e38> (a [I)
	at java.lang.Thread.run(Thread.java:724)

   Locked ownable synchronizers:
	- None

"RMI Scheduler(0)" daemon prio=6 tid=0x03e30000 nid=0x464 waiting on condition [0x046bf000]
   java.lang.Thread.State: TIMED_WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x28de9928> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2082)
	at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1090)
	at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:807)
	at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:724)

   Locked ownable synchronizers:
	- None

"RMI TCP Connection(1)-141.206.218.103" daemon prio=6 tid=0x03e28000 nid=0x1e54 in Object.wait() [0x045de000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x28e77088> (a com.sun.jmx.remote.internal.ArrayNotificationBuffer)
	at com.sun.jmx.remote.internal.ArrayNotificationBuffer.fetchNotifications(ArrayNotificationBuffer.java:449)
	- locked <0x28e77088> (a com.sun.jmx.remote.internal.ArrayNotificationBuffer)
	at com.sun.jmx.remote.internal.ArrayNotificationBuffer$ShareBuffer.fetchNotifications(ArrayNotificationBuffer.java:227)
	at com.sun.jmx.remote.internal.ServerNotifForwarder.fetchNotifs(ServerNotifForwarder.java:275)
	at javax.management.remote.rmi.RMIConnectionImpl$3.run(RMIConnectionImpl.java:1289)
	at javax.management.remote.rmi.RMIConnectionImpl$3.run(RMIConnectionImpl.java:1287)
	at javax.management.remote.rmi.RMIConnectionImpl.fetchNotifications(RMIConnectionImpl.java:1293)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322)
	at sun.rmi.transport.Transport$1.run(Transport.java:177)
	at sun.rmi.transport.Transport$1.run(Transport.java:174)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:724)

   Locked ownable synchronizers:
	- <0x28e77400> (a java.util.concurrent.ThreadPoolExecutor$Worker)

"RMI TCP Accept-0" daemon prio=6 tid=0x03e0fc00 nid=0x18e0 runnable [0x0413f000]
   java.lang.Thread.State: RUNNABLE
	at java.net.DualStackPlainSocketImpl.accept0(Native Method)
	at java.net.DualStackPlainSocketImpl.socketAccept(DualStackPlainSocketImpl.java:131)
	at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398)
	at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:198)
	- locked <0x28de9b50> (a java.net.SocksSocketImpl)
	at java.net.ServerSocket.implAccept(ServerSocket.java:530)
	at java.net.ServerSocket.accept(ServerSocket.java:498)
	at sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(LocalRMIServerSocketFactory.java:52)
	at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:387)
	at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(TCPTransport.java:359)
	at java.lang.Thread.run(Thread.java:724)

   Locked ownable synchronizers:
	- None

"DestroyJavaVM" prio=6 tid=0x00acb800 nid=0x125c waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
	- None

"t3" prio=6 tid=0x03cc3800 nid=0x1614 waiting for monitor entry [0x03f3f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
	at lock.SyncThread.run(ThreadDeadlock.java:42)
	- waiting to lock <0x28de9cc8> (a java.lang.Object)
	- locked <0x28de9cd0> (a java.lang.Object)
	at java.lang.Thread.run(Thread.java:724)

   Locked ownable synchronizers:
	- None

"t2" prio=6 tid=0x03cc3000 nid=0x1b3c waiting for monitor entry [0x03aaf000]
   java.lang.Thread.State: BLOCKED (on object monitor)
	at lock.SyncThread.run(ThreadDeadlock.java:42)
	- waiting to lock <0x28de9cd0> (a java.lang.Object)
	- locked <0x28de9d68> (a java.lang.Object)
	at java.lang.Thread.run(Thread.java:724)

   Locked ownable synchronizers:
	- None

"t1" prio=6 tid=0x00a66400 nid=0x19e0 waiting for monitor entry [0x03f9f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
	at lock.SyncThread.run(ThreadDeadlock.java:42)
	- waiting to lock <0x28de9d68> (a java.lang.Object)
	- locked <0x28de9cc8> (a java.lang.Object)
	at java.lang.Thread.run(Thread.java:724)

   Locked ownable synchronizers:
	- None

"Service Thread" daemon prio=6 tid=0x00a60800 nid=0x118c runnable [0x00000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
	- None

"C1 CompilerThread0" daemon prio=10 tid=0x00a5ec00 nid=0x14bc waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
	- None

"Attach Listener" daemon prio=10 tid=0x00a5a400 nid=0x1e08 waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
	- None

"Signal Dispatcher" daemon prio=10 tid=0x00a7fc00 nid=0x4d4 runnable [0x00000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
	- None

"Finalizer" daemon prio=8 tid=0x00a37800 nid=0x10f4 in Object.wait() [0x03aff000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x28dea030> (a java.lang.ref.ReferenceQueue$Lock)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
	- locked <0x28dea030> (a java.lang.ref.ReferenceQueue$Lock)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
	at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:189)

   Locked ownable synchronizers:
	- None

"Reference Handler" daemon prio=10 tid=0x00a32c00 nid=0xeac in Object.wait() [0x03b8f000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x28de9918> (a java.lang.ref.Reference$Lock)
	at java.lang.Object.wait(Object.java:503)
	at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
	- locked <0x28de9918> (a java.lang.ref.Reference$Lock)

   Locked ownable synchronizers:
	- None

"VM Thread" prio=10 tid=0x00a31800 nid=0x1474 runnable 

"VM Periodic Task Thread" prio=10 tid=0x00a61400 nid=0x1844 waiting on condition 

JNI global references: 181


Found one Java-level deadlock:
=============================
"t3":
  waiting to lock monitor 0x03cc4d2c (object 0x28de9cc8, a java.lang.Object),
  which is held by "t1"
"t1":
  waiting to lock monitor 0x00a36aac (object 0x28de9d68, a java.lang.Object),
  which is held by "t2"
"t2":
  waiting to lock monitor 0x00a37744 (object 0x28de9cd0, a java.lang.Object),
  which is held by "t3"

Java stack information for the threads listed above:
===================================================
"t3":
	at lock.SyncThread.run(ThreadDeadlock.java:42)
	- waiting to lock <0x28de9cc8> (a java.lang.Object)
	- locked <0x28de9cd0> (a java.lang.Object)
	at java.lang.Thread.run(Thread.java:724)
"t1":
	at lock.SyncThread.run(ThreadDeadlock.java:42)
	- waiting to lock <0x28de9d68> (a java.lang.Object)
	- locked <0x28de9cc8> (a java.lang.Object)
	at java.lang.Thread.run(Thread.java:724)
"t2":
	at lock.SyncThread.run(ThreadDeadlock.java:42)
	- waiting to lock <0x28de9cd0> (a java.lang.Object)
	- locked <0x28de9d68> (a java.lang.Object)
	at java.lang.Thread.run(Thread.java:724)

Found 1 deadlock.
  • 大小: 215.8 KB
分享到:
评论
1 楼 城的灯 2015-05-03  
文章不错,这篇文章写的也很好,http://www.yangguo.info/2015/4/1/17.html。

相关推荐

    java 线程 dump 分析工具 2.3.3

    java 线程Dump 分析工具: Java的TDA线程转储分析器是一个用于分析Sun Java VM生成的线程转储和堆信息的小型Swing GUI(目前用1.4测试)。...如果记录了类的直方图,它还提供了线程转储中的堆对象的概述。

    jvm-monitoring-agent:从内部监视JVM,检测线程块并自动保存线程转储

    监视JVM线程并在给定时间内阻塞线程时保存线程转储。 用法 从下载jar 将其添加到要监视的应用程序的命令行中: java -javaagent:jvm-monitoring-agent-0.9.0.jar=threshold=1000,debug ...rest of command 配置...

    jstack-review:基于Java的JVM线程转储分析器

    Java线程转储分析器 这是用Java编写的Java线程转储分析器。 它基于的。 有关用法的其他信息,请参见 。 执照 Java Thread Dump Analyzer是根据。 版权所有2014-2016 Spotify AB 版权所有2016-2018 MP Objects BV...

    threaddump-analyzer:JVM线程转储分析器

    Java线程转储分析器这是用Java编写的Java线程转储分析器。 执照Java Thread Dump Analyzer是根据,版权属于Spotify AB。本地测试npm installnpm test 使用npm 6.13.7和node v13.8.0测试。去做在“同步器”部分中,使...

    lockviz:可视化Java线程转储-开源

    该工具允许用户加载,可视化和分析Visual VM生成的Java线程转储。 请参阅Wiki,以获取快速入门指南和教程。

    LockViz:用于可视化 Java 线程转储的项目

    锁定可视化 用于可视化 Java 线程转储的项目。

    nstack:生成.NET托管进程线程转储的简单实用程序(类似于Java jstack)

    堆栈生成.NET托管进程线程转储的简单实用程序(类似于Java jstack),即所有托管线程的当前stacktrace。 基于可从获得的Managed Stack Explorer中的代码。 要运行它,请使用nstack.exe &lt;PID&gt; 。 它将所有托管线程的...

    JDayLviv-ThreadDumpsOnJVM:JDayLviv 2015的演示文稿,JVM上的线程转储

    JVM @ JDay Lviv上的线程转储目录演示期间使用的命令书目/链接 承诺您如何获得一个线程转储? 打印线程? 什么是安全点,为什么要当心? 哪些工具可以提供帮助?如何提供帮助? 当你有了线程转储时...里面有什么? ...

    JavaVisualVM可视化多线程监控分析工具v1.3.8官方安装版

    Java VisualVM是一个多线程的监控分析工具,VisualVM 是一款免费的\集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优。功能包括内存分析、快照功能、转储功能...

    Java问题定位技术.pdf

    Java线程堆栈是虚拟机中线程(包括锁)状态的一个瞬间快照,即系统在某 个时刻所有线程的运行状态,包括每一个线程的调用堆栈, 锁的持有情况等信息。 每一种Java虚 拟机(SUN JVM、 IBM JVM、 JRokit、 GNU JVM等等)...

    java-buildpack-diagnostics-app:用于获取诊断信息(如线程转储、堆转储和内存信息)的 Java Web App

    此应用程序旨在添加到 java-buildpack 分支,以便诊断应用程序部署在与实际应用程序相同的 Tomcat 容器中。 您不必修改您的应用程序即可使用它。 还有一个单独的基于 shell 脚本的解决方案,用于。 需要关注的 ...

    Java Thread Dumps 分析

    Java线程转储分析: 《Analyzing Java Thread Dumps.pdf》 《Java Thread Dumps 分析.pdf》

    Java并发编程(学习笔记).xmind

    通过线程转储信息来分析死锁 其他活跃性危险 饥饿 要避免使用线程优先级,因为这会增加平台依赖性,并可能导致活跃性问题。在大多数并发应用程序中,都可以使用默认的线程优先级。 糟糕的响应性...

    Java并发编程实战

    本书深入浅出地介绍了Java线程和并发,是一本完美的Java并发参考手册。书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则...

    kubectl-java:Kubectl Java插件

    Kubectl Java插件 目录关于该项目使用k8s开发Java应用程序时,kubectl Java插件将使您的生活更轻松: 查找运行Java应用程序的Pod jvm线程转储(:man_technologist_light_skin_tone:现在可以工作) 导出jvm调试端口并...

    java8看不到源码-awesome-articles:不同主题的文章精选列表

    线程解释,线程状态是什么以及如何分析线程转储。 - 通过分步指南及其背后的原因解决真正复杂的问题。 Maven - Maven 配置文件 调试 - 类加载器、JVM 字节码内部结构 缓存 - JCache API Refcard 和通用术语解释 字节...

    jca467.zip

    在基于POSIX的系统(例如Linux)上请求线程转储的最简单方法是发送kill -3信号,该信号无损地暂停JVM,创建线程转储,然后JVM继续(暂停通常为几百毫秒最多)。例如(用Java进程的进程ID替换$ {PID}):

    codepot-dumps

    如你看到的... 我们在用什么? jps-显示Java进程的PID ...kill -3 &lt;PID&gt;-将线程转储到Java进程标准输出 jstack &lt;PID&gt;-将线程转储到stdout jvisualvm-一切;) top -Hp-进程线程对CPU使用率的细分

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    / 327 12.3.5 原子性、可见性与有序性 / 328 12.3.6 先行发生原则 / 330 12.4 Java与线程 / 333 12.4.1 线程的实现 / 333 12.4.2 Java线程调度 / 337 12.4.3 状态转换 / 339 12.5 本章小结 / 341 第13章 ...

    Java性能分析神器-JProfiler

    - 丰富的性能分析功能:JProfiler 提供了丰富的性能分析功能,包括堆转储、线程分析、GC 监控、CPU 监控等。 - 可扩展性:JProfiler 可以与各种 Java 框架集成,例如 Spring、Hibernate、MyBatis 等。 总之,...

Global site tag (gtag.js) - Google Analytics