都知道jstack是干嘛的
本文讲如何看它的输出内容:
1. synchronized
已经进入临界区,sleep,在边界等待
@Test
public void testSync() {
final String s = "test";
Runnable task = new Runnable() {
public void run() {
synchronized (s) {
try {
Thread.sleep(60 * 1000);
} catch (InterruptedException e) {
//这里直接抓住就不要深究了
e.printStackTrace();
}
}
}
};
Thread t = new Thread(task, "test-thread");
t.start();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (s) {
System.out.println("end....");
}
}
这个用例简单说就是,先起一个线程“test-thread",取得对象s上的锁,然后sleep 1min。
然后主线程尝试获取s上的锁,当然就会被阻塞住了(1min),通过jstack取得信息如下:
"test-thread" prio=6 tid=0x000000000749e800 nid=0x10f4 waiting on condition [0x000000000787f000]
java.lang.Thread.State: TIMED_WAITING (sleeping) //处于TIMED_WAITING状态,等待某个条件
at java.lang.Thread.sleep(Native Method)
at com.snowm.test.concurrent.TestInnerImplements$1.run(TestInnerImplements.java:17)
- locked <0x000000077f454e80> (a java.lang.String) //已经对一个String对象加锁(已进入临界区)
at java.lang.Thread.run(Thread.java:662)
Locked ownable synchronizers:
- None
"main" prio=6 tid=0x000000000027c000 nid=0x188c waiting for monitor entry [0x000000000260e000]
java.lang.Thread.State: BLOCKED (on object monitor) //处于BLOCKED状态,是synchronized干的
at com.snowm.test.concurrent.TestInnerImplements.testSync(TestInnerImplements.java:34)
- waiting to lock <0x000000077f454e80> (a java.lang.String) //在等待对一个String对象加锁(还在边界)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
Locked ownable synchronizers:
- None
重入,以及wait()
@Test
public void testSyncReentryWait() {
final String s = "test";
synchronized (s) {
synchronized (s) {
try {
s.wait();
} catch (InterruptedException e) {
// 这里直接抓住就不要深究了
e.printStackTrace();
}
}
}
}
"main" prio=6 tid=0x000000000018c000 nid=0x2624 in Object.wait() [0x00000000024de000]
java.lang.Thread.State: WAITING (on object monitor)//处于WAITING状态,是Object.wait()干的
at java.lang.Object.wait(Native Method)
- waiting on <0x000000077f455268> (a java.lang.String)//在等一个String对象的信号
at java.lang.Object.wait(Object.java:485)
at com.snowm.test.concurrent.TestInnerImplements.testSyncReentryWait(TestInnerImplements.java:44)
- locked <0x000000077f455268> (a java.lang.String)//又对这个String对象加锁(地址一样)
- locked <0x000000077f455268> (a java.lang.String)//已经对一个String对象加锁
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Locked ownable synchronizers:
- None
wait(time)
@Test
public void testSyncWaittime() {
final String s = "test";
synchronized (s) {
try {
s.wait(60 * 1000);
} catch (InterruptedException e) {
// 这里直接抓住就不要深究了
e.printStackTrace();
}
}
}
"main" prio=6 tid=0x000000000051c000 nid=0x148c in Object.wait() [0x00000000026ae000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x000000077f456018> (a java.lang.String)
at com.snowm.test.concurrent.TestInnerImplements.testSyncWaittime(TestInnerImplements.java:62)
- locked <0x000000077f456018> (a java.lang.String)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Locked ownable synchronizers:
- None
2. ReentrantLock
已经进入临界区,在边界等待
@Test
public void testReentrantLock() {
final ReentrantLock lock = new ReentrantLock();
Runnable task = new Runnable() {
public void run() {
lock.lock();
try {
Thread.sleep(60*1000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
};
Thread t = new Thread(task, "test-thread");
t.start();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
lock.lock();
try {
System.out.println("end....");
} finally {
lock.unlock();
}
}
"test-thread" prio=6 tid=0x00000000075df800 nid=0x25c8 waiting on condition [0x00000000080ff000]
java.lang.Thread.State: TIMED_WAITING (sleeping)//sleep
at java.lang.Thread.sleep(Native Method)
at com.snowm.test.concurrent.TestInnerImplements$2.run(TestInnerImplements.java:63)
at java.lang.Thread.run(Thread.java:662)
Locked ownable synchronizers:
- <0x00000007d6e1b420> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)//锁住当前线程的同步器拥有者
"main" prio=6 tid=0x000000000053c000 nid=0x2274 waiting on condition [0x000000000264e000]
java.lang.Thread.State: WAITING (parking)//WAITING,unsafe.park()干的
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000007d6e1b420> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)//parking在等待某个同步器(就是test-thread上那个锁同步器)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:811)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:842)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1178)
at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:186)
at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:262)
at com.snowm.test.concurrent.TestInnerImplements.testReentrantLock(TestInnerImplements.java:81)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Locked ownable synchronizers:
- None
重入
@Test
public void testReentrantLockReentry() {
final ReentrantLock lock = new ReentrantLock();
lock.lock();
lock.lock();
try {
Thread.sleep(60 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
lock.unlock();
}
}
"main" prio=6 tid=0x000000000022c000 nid=0x1728 waiting on condition [0x00000000025de000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at com.snowm.test.concurrent.TestInnerImplements.testReentrantLockReentry(TestInnerImplements.java:93)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
Locked ownable synchronizers:
- <0x00000007d6e1dc10> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)//锁住当前线程的同步器拥有者
await()
@Test
public void testReentrantLockAwait() {
final ReentrantLock lock = new ReentrantLock();
final Condition condition = lock.newCondition();
lock.lock();
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
"main" prio=6 tid=0x00000000005bc000 nid=0x10f4 waiting on condition [0x000000000250e000]
java.lang.Thread.State: WAITING (parking)//WAITING,Unsafe.park()干的
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000007d6e1f108> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)//parking在等待一个条件对象的信号
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987)
at com.snowm.test.concurrent.TestInnerImplements.testReentrantLockAwait(TestInnerImplements.java:132)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Locked ownable synchronizers:
- None
await(time, timeUnit)
@Test
public void testReentrantLockAwaitTime() {
final ReentrantLock lock = new ReentrantLock();
final Condition condition = lock.newCondition();
lock.lock();
try {
condition.await(60, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
"main" prio=6 tid=0x000000000036c000 nid=0x148c waiting on condition [0x00000000025be000]
java.lang.Thread.State: TIMED_WAITING (parking)//WAITING, Unsafe.park()干的
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000007d6e20798> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)//parking在等待一个条件对象的信号
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:196)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2116)
at com.snowm.test.concurrent.TestInnerImplements.testReentrantLockAwaitTime(TestInnerImplements.java:146)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Locked ownable synchronizers:
- None
3. LockSupport.park
没有blocker
@Test
public void testPark() {
LockSupport.park();
}
"main" prio=6 tid=0x000000000055c000 nid=0x30c8 waiting on condition [0x000000000258e000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:283)
at com.snowm.test.concurrent.TestInnerImplements.testPark(TestInnerImplements.java:171)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Locked ownable synchronizers:
- None
有blocker
@Test
public void testParkWithBlocker() {
LockSupport.park(this);
}
"main" prio=6 tid=0x000000000026c000 nid=0x2674 waiting on condition [0x000000000256e000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000007d6e1d2e0> (a com.snowm.test.concurrent.TestInnerImplements)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
at com.snowm.test.concurrent.TestInnerImplements.testParkWithBlocker(TestInnerImplements.java:176)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Locked ownable synchronizers:
- None
分享到:
相关推荐
jstack工具主要用来打印java堆栈信息,主要是java的class名字,方法名,字节码索引,行数等信息。这篇文章主要介绍了JDK14性能管理工具之jstack使用介绍,需要的朋友可以参考下
主要介绍了Java线程Dump分析工具jstack解析及使用场景,具有一定借鉴价值,需要的朋友可以参考下
抓取jstack方法及解决system用户执行jstack命令权限问题, 打开cmd窗口,输入命令 jstack -l 49824>>C:/error01.txt 其中49824为tomcat8.0 的pid ; error01.txt 这个可以自己取名字 多输出几份jstack 文件,做比对...
Kubernetes应用java程序无法使用jmap,jstack的解决方案.docx
使用jstack定位分析CPU消耗问题
windows系统jstack自动抓取脚本
图形界面分析threadump_jstack分析工具_包含jdk。IBM出品,用来分析jstack pid 打印的信息。用着挺方便的。
jmap、jstack、jstat组合使用定位jvm问题
MPP的jstack分析结果
JStack和Java Thread Dumps分析
JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解.docx
需要本地安装JDK并配置JAVA环境变量。 之后使用java -jar jca469.jar即可打开工具。 直接将dump出来的堆栈信息,打开,便可分析。
JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jstat.doc
用jstack分析CPU占用率高的原因 1 top -H -p pid 2 linux printf命令将10进制转换为16进制 3在jstack中找到相应的堆栈信息jstack pid grep 'nid' -C5 –color
Broken pipe产生的原因通常是当管道读端没有在读,而管道的写端继续有线程在写,就会造成管道中断。(由于管道是单向通信的) SIGSEGV(Segment fault)意味着指针所对应的地址是无效地址,没有物理内存对应该地址。
通过ps到java进程号将进程的jstack信息输出。jstack信息是java进程的线程堆栈信息,通过该信息可以分析java的线程阻塞等问题。
自动抓取jstack
这是一个 jstack 保存的死锁现场,由于 log4j consoleAppender 和 System.out 竞争资源导致的锁冲突,目前还不知道根本原因,需要分析。
tda看ThreadDump文件,配合jstack使用,非常好用的小工具
jstack生成的Thread Dump日志.docx 系统线程状态 (Native Thread Status) 系统线程有如下状态: deadlock 死锁线程,一般指多个线程调用期间进入了相互资源占用,导致一直等待无法释放的情况。 ...