您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

jstack命令详解

2024/4/5 16:38:38发布18次查看
jstack命令可以用来查看运行的java进程下,多线程的运行情况,语句如“[root@admin ~]# jstack 43616full thread dump java hotspot(tm) 64-bit server...”。
推荐:《java教程》
java jstack 命令详解
java 中 jstack 命令可以用来查看运行的 java 进程下,多线程的运行情况,我们用一个死锁的例子来看:
比如下面这段死锁的代码:
public class deadlock { private static object obja = new object(); private static object objb = new object(); public static void main(string[] args) { thread thread1 = new thread(new thread1()); thread thread2 = new thread(new thread2()); thread1.start(); thread2.start(); } private static class thread1 implements runnable{ @override public void run() { synchronized (obja) { system.out.println("线程1得到a对象的锁"); try { thread.sleep(3000); } catch (interruptedexception e) { e.printstacktrace(); } synchronized (objb) { system.out.println("线程1得到b对象的锁"); } } } } private static class thread2 implements runnable{ @override public void run() { synchronized (objb) { system.out.println("线程2得到b对象的锁"); try { thread.sleep(3000); } catch (interruptedexception e) { e.printstacktrace(); } synchronized (obja) { system.out.println("线程2得到a对象的锁"); } } } }}
当然,运行结果只能看到两个线程只拿到了一个锁,在一直等待对方的锁。
线程1得到a对象的锁线程2得到b对象的锁
我们可以使用 jps 来查看对应的 pid ,然后使用 jstack 来查看其线程情况:
[root@admin ~]# jps42576 jps43616 deadlock
[root@admin ~]# jstack 43616full thread dump java hotspot(tm) 64-bit server vm (24.45-b08 mixed mode):"destroyjavavm" prio=6 tid=0x00000000047c1000 nid=0x9878 waiting on condition [0x0000000000000000] java.lang.thread.state: runnable"thread-1" prio=6 tid=0x0000000010aa3000 nid=0xafa0 waiting for monitor entry [0x000000001105f000] java.lang.thread.state: blocked (on object monitor) at com.zaimeibian.test$thread2.run(test.java:46) - waiting to lock <0x00000007c099cc20> (a java.lang.object) - locked <0x00000007c099cc30> (a java.lang.object) at java.lang.thread.run(thread.java:744)"thread-0" prio=6 tid=0x0000000010aa2800 nid=0xae74 waiting for monitor entry [0x0000000010f5f000] java.lang.thread.state: blocked (on object monitor) at com.zaimeibian.test$thread1.run(test.java:27) - waiting to lock <0x00000007c099cc30> (a java.lang.object) - locked <0x00000007c099cc20> (a java.lang.object) at java.lang.thread.run(thread.java:744)"service thread" daemon prio=6 tid=0x000000000f10a000 nid=0x9a8c runnable [0x0000000000000000] java.lang.thread.state: runnable"c2 compilerthread1" daemon prio=10 tid=0x000000000f109800 nid=0xaf28 waiting on condition [0x0000000000000000] java.lang.thread.state: runnable"c2 compilerthread0" daemon prio=10 tid=0x000000000f105800 nid=0x85dc waiting on condition [0x0000000000000000] java.lang.thread.state: runnable"attach listener" daemon prio=10 tid=0x000000000f104800 nid=0xac04 waiting on condition [0x0000000000000000] java.lang.thread.state: runnable"signal dispatcher" daemon prio=10 tid=0x000000000f102000 nid=0xa678 runnable [0x0000000000000000] java.lang.thread.state: runnable"finalizer" daemon prio=8 tid=0x000000000f0bd000 nid=0xaed8 in object.wait() [0x000000001045f000] java.lang.thread.state: waiting (on object monitor) at java.lang.object.wait(native method) - waiting on <0x00000007c0905568> (a java.lang.ref.referencequeue$lock) at java.lang.ref.referencequeue.remove(referencequeue.java:135) - locked <0x00000007c0905568> (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)"reference handler" daemon prio=10 tid=0x000000000f0b2000 nid=0xaedc in object.wait() [0x000000001035f000] java.lang.thread.state: waiting (on object monitor) at java.lang.object.wait(native method) - waiting on <0x00000007c09050f0> (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 <0x00000007c09050f0> (a java.lang.ref.reference$lock)"vm thread" prio=10 tid=0x000000000f0b0000 nid=0xaef0 runnable"gc task thread#0 (parallelgc)" prio=6 tid=0x00000000047d6000 nid=0xacb0 runnable"gc task thread#1 (parallelgc)" prio=6 tid=0x00000000047d8000 nid=0xaee0 runnable"gc task thread#2 (parallelgc)" prio=6 tid=0x00000000047d9800 nid=0xaed4 runnable"gc task thread#3 (parallelgc)" prio=6 tid=0x00000000047db000 nid=0xac54 runnable"vm periodic task thread" prio=10 tid=0x000000000f132000 nid=0xaff0 waiting on conditionjni global references: 105found one java-level deadlock:============================="thread-1": waiting to lock monitor 0x000000000f0ba488 (object 0x00000007c099cc20, a java.lang.object), which is held by "thread-0""thread-0": waiting to lock monitor 0x000000000f0bcf28 (object 0x00000007c099cc30, a java.lang.object), which is held by "thread-1"java stack information for the threads listed above:==================================================="thread-1": at com.zaimeibian.test$thread2.run(test.java:46) - waiting to lock <0x00000007c099cc20> (a java.lang.object) - locked <0x00000007c099cc30> (a java.lang.object) at java.lang.thread.run(thread.java:744)"thread-0": at com.zaimeibian.test$thread1.run(test.java:27) - waiting to lock <0x00000007c099cc30> (a java.lang.object) - locked <0x00000007c099cc20> (a java.lang.object) at java.lang.thread.run(thread.java:744)found 1 deadlock.
我们可以看到 jstack 打印出了线程的状态,而且发现一个死锁。
另外,线程状态有以下几种:
- runnable 线程运行中或 i/o 等待
- blocked 线程在等待 monitor 锁( synchronized 关键字)
- timed_waiting 线程在等待唤醒,但设置了时限
- waiting 线程在无限等待唤醒
以上就是jstack命令详解的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product