`
snowm
  • 浏览: 1256 次
  • 来自: ...
最近访客 更多访客>>
社区版块
存档分类
最新评论

jstack使用

    博客分类:
  • JVM
 
阅读更多

都知道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使用说明PDF

    Jstack使用说明

    Java线程Dump分析工具jstack解析及使用场景

    本文将深入解析jstack的使用方法及其在不同场景下的应用。 jstack命令的基本格式如下: ``` jstack [-l] [-F] pid ``` 其中,`pid` 是Java进程的ID,`-l` 选项会提供更详细的线程和锁信息,而 `-F` 选项则用于在...

    JDK14性能管理工具之jstack使用介绍

    使用jstack时,它会向目标Java进程发送一个请求,以获取当前所有线程的堆栈跟踪信息。输出结果通常包括线程ID、线程状态、执行堆栈的类名、方法名、字节码索引和行号。这对于开发者和运维人员来说,都是理解和解决...

    抓取jstack方法及解决system用户执行jstack命令权限问题

    抓取jstack方法及解决system用户执行jstack命令权限问题, 打开cmd窗口,输入命令 jstack -l 49824&gt;&gt;C:/error01.txt 其中49824为tomcat8.0 的pid ; error01.txt 这个可以自己取名字 多输出几份jstack 文件,做比对...

    使用jstack定位分析CPU消耗问题.docx

    使用 jstack 定位分析 CPU 消耗问题 在实际生产环境中,CPU 占用率过高的问题经常会出现,特别是在高并发情况下。使用 jstack 工具可以帮助我们快速定位 CPU 消耗问题的根源。本文将详细介绍使用 jstack 工具定位...

    Kubernetes应用java程序无法使用jmap,jstack的解决方案.docx

    Kubernetes 应用 Java 程序无法使用 jmap, jstack 的解决方案 背景: 在 Kubernetes 环境中,运行 Java 程序时,无法使用 jmap 和 jstack 命令进行性能分析和诊断。这种情况下,无法获取 Java 进程的 pid,导致无法...

    JStack和Java Thread Dumps分析

    本文将详细介绍`JStack`的使用方法及其在分析Java线程堆栈中的应用。 #### 二、JStack简介 `JStack`是Java Development Kit (JDK)的一部分,用于生成正在运行的Java应用程序的线程快照。这些快照提供了关于每个...

    图形界面分析threadump_jstack分析工具_包含jdk

    标题中的“图形界面分析threadump_jstack分析工具_包含jdk”指的是一个专用于分析Java应用程序线程堆栈信息的工具,该工具具有图形用户界面,能够帮助开发者更直观地理解和解决程序中的线程问题。这个工具包含了JDK...

    MPP的jstack分析结果

    《深入理解MPP系统中的jstack分析》 在IT领域,特别是大数据处理中,MPP(Massive Parallel Processing)系统因其高效的数据处理能力而被广泛应用。然而,随着系统的复杂性增加,性能调优和问题排查变得至关重要。...

    输出java进程的jstack信息示例分享 通过线程堆栈信息分析java线程

    为了获取这些信息,我们可以使用jstack工具,它是Java开发工具包(JDK)的一部分,能够输出Java进程的线程堆栈跟踪信息。 jstack命令通常可以输出以下类型的信息: 1. 线程的完整堆栈跟踪,包括本地方法。 2. 显示...

    windows系统jstack自动抓取脚本

    windows系统jstack自动抓取脚本

    jmap、jstack、jstat组合使用定位jvm问题.txt

    jmap、jstack、jstat组合使用定位jvm问题

    JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解.docx

    JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解 本文将对一些常用的 JVM 性能调优监控工具进行介绍,包括 jps、jstack、jmap、jhat、jstat 等工具的使用详解。这些工具对于 Java 程序员来说是必备的,...

    使用jstack -l pid > jstack.log排查问题

    jstack 分析工具

    JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jstat.doc

    本文将深入探讨六种关键的JVM监控工具——`jstack`, `jconsole`, `jinfo`, `jmap`, `jdb`, `jstat`——它们各自的功能、应用场景及如何帮助开发者和运维人员诊断并解决JVM中的复杂问题。 #### 1. jstack —— Java ...

    jstack-jboss-7.5.0-Final.zip

    要分析这个问题,我们需要使用`jstack`工具。`jstack`是Java虚拟机自带的一个命令行工具,它可以打印出指定进程的线程堆栈信息,帮助开发者找出死锁、线程阻塞等问题。在`8508.jstack2.log`文件中,我们可以找到所有...

    Jstack分析工具——IBM Thread and Monitor Dump Analyzer for Java

    需要本地安装JDK并配置JAVA环境变量。 之后使用java -jar jca469.jar即可打开工具。 直接将dump出来的堆栈信息,打开,便可分析。

    用jstack分析CPU占用率高的原因.zip

    用jstack分析CPU占用率高的原因 1 top -H -p pid 2 linux printf命令将10进制转换为16进制 3在jstack中找到相应的堆栈信息jstack pid grep 'nid' -C5 –color

    jstack文件

    Broken pipe产生的原因通常是当管道读端没有在读,而管道的写端继续有线程在写,就会造成管道中断。(由于管道是单向通信的) SIGSEGV(Segment fault)意味着指针所对应的地址是无效地址,没有物理内存对应该地址。

    jstack生成的Thread Dump日志.docx

    - 使用`jstack`配合`jconsole`、`VisualVM`等工具定期收集Thread Dump,分析趋势,找出异常行为。 - 优化同步策略,减少不必要的锁竞争,考虑使用`ReentrantLock`、`Semaphore`等高级同步工具,或使用并发集合类。...

Global site tag (gtag.js) - Google Analytics