`
jobar
  • 浏览: 346921 次
  • 性别: 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测试)。...如果记录了类的直方图,它还提供了线程转储中的堆对象的概述。

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

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

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

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

    用Java thread dump 去分析程序的问题

    Java线程转储(Thread Dump)是诊断Java应用程序性能问题和异常情况的重要工具。它提供了一个运行中的Java应用中所有线程的快照,详细显示每个线程的状态、堆栈跟踪以及线程名称。线程状态包括RUNNABLE、BLOCKED、...

    IBM_Thread_and_Monitor_Dump_Analyzer_for_Java_Jisuxz.com.zip

    1. **生成线程转储**:在Java应用程序中,可以通过JConsole、VisualVM或者发送特定信号(如`kill -3 &lt;pid&gt;`)来生成线程转储文件。 2. **加载转储文件**:启动TMDA,导入生成的线程转储文件。 3. **分析线程**:...

    java IBM 分析工具(线程、gc、内存)

    这是一个专门用于解析Java线程和监视器转储的工具,它能够帮助开发者识别和解决多线程应用程序中的死锁、阻塞和其他并发问题。该工具可以分析线程堆栈信息,展示每个线程的状态,包括运行、等待、阻塞等,并提供详细...

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

    使用`LockViz`时,你需要先获取Java线程转储文件(通常以`.hprof`为扩展名),然后使用`LockViz`解析并生成可视化结果。这个过程可能涉及到命令行操作或者集成到开发环境中,具体步骤根据不同的版本和使用环境可能会...

    Java Thread Dumps 分析

    分析Java线程转储对于诊断Java应用程序中的性能问题、死锁、线程阻塞等状况至关重要。 在《Analyzing Java Thread Dumps.pdf》和《Java Thread Dumps 分析.pdf》这两份文档中,你可以深入理解以下几个关键知识点: ...

    Java多线程的监控分析工具(VisualVM).doc

    3. **线程转储(Thread Dump)**:通过生成线程转储文件,开发者可以查看在特定时刻所有线程的详细信息,包括调用栈,这有助于定位导致阻塞或挂起的问题。 4. **堆转储(Heap Dump)**:当遇到内存泄漏问题时,可以使用...

    Java thread dump analyzer (tda)

    线程转储是Java虚拟机(JVM)在特定时刻生成的一种快照,其中包含了应用程序中所有活动线程的状态信息,这对于诊断多线程程序中的性能问题和死锁情况至关重要。 TDA全称为Thread Dump Analyzer,它能够帮助开发者深入...

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

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

    sun threaddump analyzer

    线程转储是JVM在特定时刻生成的一种快照,它包含了所有运行中线程的状态信息,这对于诊断Java应用程序的性能问题、死锁或线程阻塞等问题非常有帮助。TDA工具能够帮助开发者更有效地理解和解析这些复杂的信息。 首先...

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

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

    java 线程

    - **Thread Dump**: 当应用出现性能问题或死锁时,可以生成线程转储快照进行分析。 - **线程池**: 使用`ExecutorService`创建线程池,可以有效控制并发数量,避免频繁创建销毁线程的开销。 - **并发编程的最佳...

    15个顶级JAVA多线程面试题及回答[文].pdf

    面试时还可能需要解释“什么是线程转储(Thread Dump)”以及如何在不同的操作系统上获取线程转储信息,比如在UNIX系统上使用kill -3命令,而在Windows系统上则使用CTRL+Break。 理解Java中的并发和多线程编程的...

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

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

    Thread Dump Analyzer

    1. **生成线程转储**:在Java应用中,可以通过JConsole、JVisualVM或其他工具生成线程转储文件。 2. **导入线程转储**:将生成的dump文件导入TDA,工具会自动解析文件内容。 3. **分析线程状态**:查看线程颜色标识...

    高级Java多线程面试题及回答(合集).docx

    10) **线程转储分析**:线程转储可以显示所有线程的状态,用于调试死锁和其他线程问题。分析线程转储包括查找阻塞、挂起或死锁的线程,以及理解每个线程的堆栈跟踪。 11) **`start()`与`run()`的差异**:`start()`...

    java VisualVM之插件TAD

    线程转储,通常也被称为线程快照,是Java应用程序在特定时刻所有线程的状态记录,这对于诊断和解决多线程应用中的死锁、线程阻塞等问题非常有用。 TAD插件的安装过程相对简单,一般遵循以下步骤: 1. 下载TAD插件...

Global site tag (gtag.js) - Google Analytics