都知道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使用说明
本文将深入解析jstack的使用方法及其在不同场景下的应用。 jstack命令的基本格式如下: ``` jstack [-l] [-F] pid ``` 其中,`pid` 是Java进程的ID,`-l` 选项会提供更详细的线程和锁信息,而 `-F` 选项则用于在...
使用jstack时,它会向目标Java进程发送一个请求,以获取当前所有线程的堆栈跟踪信息。输出结果通常包括线程ID、线程状态、执行堆栈的类名、方法名、字节码索引和行号。这对于开发者和运维人员来说,都是理解和解决...
抓取jstack方法及解决system用户执行jstack命令权限问题, 打开cmd窗口,输入命令 jstack -l 49824>>C:/error01.txt 其中49824为tomcat8.0 的pid ; error01.txt 这个可以自己取名字 多输出几份jstack 文件,做比对...
使用 jstack 定位分析 CPU 消耗问题 在实际生产环境中,CPU 占用率过高的问题经常会出现,特别是在高并发情况下。使用 jstack 工具可以帮助我们快速定位 CPU 消耗问题的根源。本文将详细介绍使用 jstack 工具定位...
Kubernetes 应用 Java 程序无法使用 jmap, jstack 的解决方案 背景: 在 Kubernetes 环境中,运行 Java 程序时,无法使用 jmap 和 jstack 命令进行性能分析和诊断。这种情况下,无法获取 Java 进程的 pid,导致无法...
本文将详细介绍`JStack`的使用方法及其在分析Java线程堆栈中的应用。 #### 二、JStack简介 `JStack`是Java Development Kit (JDK)的一部分,用于生成正在运行的Java应用程序的线程快照。这些快照提供了关于每个...
标题中的“图形界面分析threadump_jstack分析工具_包含jdk”指的是一个专用于分析Java应用程序线程堆栈信息的工具,该工具具有图形用户界面,能够帮助开发者更直观地理解和解决程序中的线程问题。这个工具包含了JDK...
《深入理解MPP系统中的jstack分析》 在IT领域,特别是大数据处理中,MPP(Massive Parallel Processing)系统因其高效的数据处理能力而被广泛应用。然而,随着系统的复杂性增加,性能调优和问题排查变得至关重要。...
为了获取这些信息,我们可以使用jstack工具,它是Java开发工具包(JDK)的一部分,能够输出Java进程的线程堆栈跟踪信息。 jstack命令通常可以输出以下类型的信息: 1. 线程的完整堆栈跟踪,包括本地方法。 2. 显示...
windows系统jstack自动抓取脚本
jmap、jstack、jstat组合使用定位jvm问题
JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解 本文将对一些常用的 JVM 性能调优监控工具进行介绍,包括 jps、jstack、jmap、jhat、jstat 等工具的使用详解。这些工具对于 Java 程序员来说是必备的,...
jstack 分析工具
本文将深入探讨六种关键的JVM监控工具——`jstack`, `jconsole`, `jinfo`, `jmap`, `jdb`, `jstat`——它们各自的功能、应用场景及如何帮助开发者和运维人员诊断并解决JVM中的复杂问题。 #### 1. jstack —— Java ...
要分析这个问题,我们需要使用`jstack`工具。`jstack`是Java虚拟机自带的一个命令行工具,它可以打印出指定进程的线程堆栈信息,帮助开发者找出死锁、线程阻塞等问题。在`8508.jstack2.log`文件中,我们可以找到所有...
需要本地安装JDK并配置JAVA环境变量。 之后使用java -jar jca469.jar即可打开工具。 直接将dump出来的堆栈信息,打开,便可分析。
用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)意味着指针所对应的地址是无效地址,没有物理内存对应该地址。
- 使用`jstack`配合`jconsole`、`VisualVM`等工具定期收集Thread Dump,分析趋势,找出异常行为。 - 优化同步策略,减少不必要的锁竞争,考虑使用`ReentrantLock`、`Semaphore`等高级同步工具,或使用并发集合类。...