Java中如何生成线程转储

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

[img]http://dl2.iteye.com/upload/attachment/0094/2083/be90506c-af24-34c6-95f4-8f6998d5486c.png[/img]

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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值