• JVM 监控工具——jstack


    【参考文章】:jstack 命令使用经验总结

    1. 简介

      jstack主要用于生成java虚拟机当前时刻的线程快照。

      线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,

      主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等

    2. 基本用法

      

     2.1 jstack  <pid>

      输出当前时刻该进程的线程快照信息;

      一般分为三个部分:

      第一部分为是当前快照的时间信息和JVM的信息;

      示例:

        

       第二部分为多个线程的执行情况,我们选取一个线程作为示例进行分析;

      示例:

        

         main:线程名称;

        prio:线程优先级;

        os_prio:线程优先级;

        tid:线程ID;

        nid:映射到Linux系统中的轻量级进程PID,快照中用16进制表示,可转为10进制在系统中进行查看;

      线程当前动作:  

        一般记录在每个 thread dump 的第一行末尾;

        runnable:表示线程在参数CPU竞争,可能在被调度运行,也可能在就绪等待;

        sleeping:表示调用了 Thread.sleep(),线程进入休眠;

        waiting on condition [0x...]表示线程被阻塞原语所阻塞, 方括号内的地址表示线程等待的资源地址; 这种和 jvm 的内置锁体系没有关系, 它是 jdk5 之后的 java.util.concurrent.locks.Condition 包下的锁机制;

        waiting for monitor entry [0x...]:表示线程在试图获取内置锁, 进入了等待区 Entry Set, 方括号内的地址表示线程等待的资源地址;

        in Object.wait() [0x...]: 表示线程调用了 object.wait(), 放弃了内置锁, 进入了等待区 Wait Set, 等待被唤醒, 方括号内的地址表示线程放弃的资源地址;

      Thread.State:  

        RUNNABLE:这种一般与线程动作 runnable 一起出现;

        BLOCKED (on object monitor): 这种一般与线程动作 waiting for monitor entry 一起出现, 不过在其线程调用栈最末端并没有一个固定的方法, 因为 synchronized 关键字可以修饰各种方法或者同步块;

        WAITING (on object monitor) 或者 TIMED_WAITING (on object monitor): 这种一般与线程动作 in Object.wait() [0x...] 一起出现, 并且线程调用栈的最末端调用方法为 at java.lang.Object.wait(Native Method), 以表示 object.wait() 方法的调用;

          另外, WAITING 与 TIMED_WAITING 的区别在于是否设置了超时中断, 即 wait(long timeout) 与 wait() 的区别;

        WAITING (parking) 或者 TIMED_WAITING (parking): 这种一般与线程动作 waiting on condition [0x...] 一起出现, 并且线程调用栈的最末端调用方法一般为 at sun.misc.Unsafe.park(Native Method);

          Unsafe.park 使用的是线程阻塞原语, 主要在 java.util.concurrent.locks.AbstractQueuedSynchronizer 类中被使用到, 很多基于 AQS 构建的同步工具, 如 ReentrantLock, Condition, CountDownLatch, Semaphore 等都会诱发线程进入该状态;

          另外, WAITING 与 TIMED_WAITING 的区别与第三点中提到的原因一致;

      线程的重要调用修饰:

        thread dump 的线程调用栈中, 一般会把与锁相关的资源使用状态以附加的形式作重点修饰, 这与线程的动作及状态有着密切的联系, 一般情况下可分为如下几类:

        locked <0x...>, 表示其成功获取了内置锁, 成为了 owner;

        parking to wait for <0x...>, 表示其被阻塞原语所阻塞, 通常与线程动作 waiting on condition 一起出现;

        waiting to lock <0x...>, 表示其在 Entry Set 中等待某个内置锁, 通常与线程动作 waiting for monitor entry 一起出现;

        waiting on <0x...>, 表示其在 Wait Set 中等待被唤醒, 通常与线程动作 in Object.wait() [0x...] 一起出现;

      第三部分为JVM级别的信息

      示例:

        

         VM Thread:虚拟机线程;

        VM Periodic Task Thread:虚拟机的工作任务线程;

        JNI global references :JNI 全局引用个数;

    2.2 jstack  -F -m  -l <pid>

      -F:进程没有响应时强制打印堆栈信息;

      -m:打印 Java 和 native C、C++ 的堆栈信息;

      -l:打印关于锁的附加信息

      当使用  -F -m 参数时,都会进行死锁的检测,打印的 thread dump 信息会包含如下信息:

      

       当使用 -l 参数时,输出当前线程持有的锁的地址和类型,没有则显示为None:

      

      

  • 相关阅读:
    HDU 1455 http://acm.hdu.edu.cn/showproblem.php?pid=1455
    UVA 11300 Spreading the Wealth
    HDU 1702 http://acm.hdu.edu.cn/showproblem.php?pid=1702
    栈的简单应用 HDU 1022 http://acm.hdu.edu.cn/showproblem.php?pid=1022
    HDU 1702 队列与栈的简单运用http://acm.hdu.edu.cn/showproblem.php?pid=1702
    背包模板(01背包,完全背包,多重背包)
    XSS内容拓展--伪造你的IP
    Linux文件系统
    2015阿里校招研发工程师笔试题
    鸟哥的私房菜复习一
  • 原文地址:https://www.cnblogs.com/virgosnail/p/11514609.html
Copyright © 2020-2023  润新知