jstack是java虚拟机自带的一种堆栈查看工具。主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。

jstack -help
Usage:jstack [-l] <pid>(to connect to running process)jstack -F [-m] [-l] <pid>(to connect to a hung process)jstack [-m] [-l] <executable> <core>(to connect to a core file)jstack [-m] [-l] [server_id@]<remote server IP or hostname>(to connect to a remote debug server)Options:-F  to force a thread dump. Use when jstack <pid> does not respond (process is hung)-m  to print both java and native frames (mixed mode)-l  long listing. Prints additional information about locks-h or -help to print this help message

1. 线程堆栈状态

以下是一个线程的堆栈输出结果:

"http-nio-8080-exec-10" #80 daemon prio=5 os_prio=0 tid=0x000000002e33e000 nid=0x1a80 waiting on condition [0x00000000369df000]java.lang.Thread.State: WAITING (parking)at sun.misc.Unsafe.park(Native Method)- parking to wait for  <0x00000006c1e418c8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:146)at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33)at org.apache.tomcat.util.threads.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1114)at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1176)at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run(Thread.java:748)

2. 调用修饰

2.1 locked

locked <地址> 目标:使用synchronized申请对象锁成功,监视器的拥有者。

通过synchronized关键字,成功获取到了对象的锁,成为监视器的拥有者,在临界区内操作。对象锁是可以线程重入的。

2.2 waiting to lock

waiting to lock <地址> 目标:使用synchronized申请对象锁未成功,在进入区等待

通过synchronized关键字,没有获取到了对象的锁,线程在监视器的进入区等待。在调用栈顶出现,线程状态为Blocked。

2.3 waiting on

waiting on <地址> 目标:使用synchronized申请对象锁成功后,释放锁幵在等待区等待

通过synchronized关键字,成功获取到了对象的锁后,调用了wait方法,进入对象的等待区等待。在调用栈顶出现,线程状态为WAITING或TIMED_WATING。

2.4 parking to wait for

parking to wait for <地址> 目标

park是基本的线程阻塞原语,不通过监视器在对象上阻塞。随concurrent包会出现的新的机制。

2. 线程状态产生的原因

runnable:状态一般为RUNNABLE。

in Object.wait():等待区等待,状态为WAITING或TIMED_WAITING。

waiting for monitor entry:进入区等待,状态为BLOCKED。

waiting on condition:等待区等待、被park。

sleeping:休眠的线程,调用了Thread.sleep()。

3. 线程Dump的分析

1. 进入区等待

"d&a-3588" daemon waiting for monitor entry [0x000000006e5d5000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.jiuqi.dna.bap.authority.service.UserService$LoginHandler.handle()
- waiting to lock <0x0000000602f38e90> (a java.lang.Object)
at com.jiuqi.dna.bap.authority.service.UserService$LoginHandler.handle()

线程状态BLOCKED,线程动作waiting for monitor entry,调用修饰waiting to lock总是一起出现。表示在代码级别已经存在冲突的调用。必然有问题的代码,需要尽可能减少其发生。

2. 同步块阻塞

"blockee-11" waiting for monitor entry
java.lang.Thread.State: BLOCKED (on object monitor)
at com.jiuqi.hcl.javadump.Blocker$2.run(Blocker.java:41)
- waiting to lock <0x00000000eb8eff68> (a java.lang.Object)
"blockee-86" waiting for monitor entry
java.lang.Thread.State: BLOCKED (on object monitor)
at com.jiuqi.hcl.javadump.Blocker$2.run(Blocker.java:41)
- waiting to lock <0x00000000eb8eff68> (a java.lang.Object)

3. 线程状态为RUNNABLE

持续运行的IO IO操作是可以以RUNNABLE状态达成阻塞。例如:数据库死锁、网络读写。 格外注对IO线程的真实状态的分析。 一般来说,被捕捉到RUNNABLE的IO调用,都是有问题的。

线程状态为RUNNABLE。 调用栈在SocketInputStream或SocketImpl上,socketRead0等方法。 调用栈包含了jdbc相关的包。很可能发生了数据库死锁

4. 线程调度的休眠

4.1 正常的线程池等待

"http-nio-8080-exec-3" #68 daemon prio=5 os_prio=0 tid=0x000000002e335800 nid=0x85a4 waiting on condition [0x000000003510e000]java.lang.Thread.State: WAITING (parking)at sun.misc.Unsafe.park(Native Method)- parking to wait for  <0x00000006c1e418c8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:146)at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33)at org.apache.tomcat.util.threads.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1114)at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1176)at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run(Thread.java:748)

4.2 可疑的线程等待(重点关注)

wait on monitor entry: 被阻塞的,肯定有问题

runnable : 注意IO线程

in Object.wait(): 注意非线程池等待

jvm(java虚拟机)线程堆栈jstack(2)相关推荐

  1. java线程堆栈_深入JVM剖析Java的线程堆栈

    在这篇文章里我将教会你如何分析JVM的线程堆栈以及如何从堆栈信息中找出问题的根因.在我看来线程堆栈分析技术是Java EE产品支持工程师所必须掌握的一门技术.在线程堆栈中存储的信息,通常远超出你的想象 ...

  2. JVM(java 虚拟机)

    JVM(java 虚拟机) 一.JVM简介 1.JVM:Java Virtual Machine (java 虚拟机) 通过软件来模拟出来的具有完整的硬件系统功能.运行在完全隔离的环境中的完整的计算机 ...

  3. 深入理解java虚拟机--线程安全与锁优化

    深入理解java虚拟机--线程安全与锁优化 面向过程编程思想和面向对象编程思想 java语言中的线程安全 线程安全的实现方法 锁优化 面向过程编程思想和面向对象编程思想 面向过程编程思想:站在计算机的 ...

  4. java虚拟机线程调优与底层原理分析_啃碎并发(七):深入分析Synchronized原理...

    原标题:啃碎并发(七):深入分析Synchronized原理 前言 记得开始学习Java的时候,一遇到多线程情况就使用synchronized,相对于当时的我们来说synchronized是这么的神奇 ...

  5. JavaEE - JVM Java虚拟机

    JVM 大家重点掌握的是垃圾回收算法(引用计数+可达性分析+标记清除+标记整理+复制算法+分代回收) 课程目标: 1. 了解 JVM 的发展史 2. 了解 JVM 运行原理 3. 掌握 JVM 基本组 ...

  6. java打印线程堆栈_Java问题定位之Java线程堆栈分析

    采用Java开发的大型应用系统越来越大,越来越复杂,很多系统集成在一起,整个系统看起来像个黑盒子.系统运行遭遇问题(系统停止响应,运行越来越慢,或者性能低下,甚至系统宕掉),如何速度命中问题的根本原因 ...

  7. JVM(JAVA虚拟机)、DVM(Dalvik虚拟机)和ART虚拟机

    一.什么是DVM,和JVM有什么不同? JVM是Java Virtual Machine,而DVM就是Dalvik Virtual Machine,是安卓中使用的虚拟机,所有安卓程序都运行在安卓系统进 ...

  8. [JVM] java虚拟机 堆

    1.概念 Java 虚拟机所管理的内存中最大的一块,Java 堆是所有线程共享的一块内存区域,在虚拟机启动时创建.此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存. J ...

  9. JVM——Java虚拟机架构

    Java虚拟机(Java virtualmachine)实现了Java语言最重要的特征:即平台无关性. 平台无关性原理:编译后的 Java程序(.class文件)由 JVM执行.JVM屏蔽了与具体平台 ...

最新文章

  1. poj 1515+poj 1438(边双连通)
  2. 使用中断后不停止_仓鼠偷吃鼠粮,被发现后立刻停止,但鼠鼠满脸不情愿
  3. Linux : shell基础(慕课网Linux达人养成计划课程笔记)
  4. python-while循环-基本格式
  5. 「BZOJ 2142」礼物
  6. 惠普打印机墨盒更换教程_惠普打印机怎么换墨盒 一不小心就洒了一桌子墨水...
  7. 你连阶级固化的原因都搞不清,又凭什么不被固化在底层?
  8. 助力网络安全发展,安全态势攻防赛事可视化
  9. 重磅公开!集14位名师教案的《最全高中数学解题思想方法汇编》
  10. [14] 胜利大逃亡
  11. 【CubeMX配置STM32的ADC】
  12. 首屏加载,与less的初始化css
  13. 【c++入门(2)】贪心训练
  14. 现如今99%的区块链都是空气项目
  15. java enum枚举类的用法以及高级玩法
  16. 58同城python_Python实战计划爬虫作业第一周作业:爬58同城
  17. Zemax学习笔记(9)- 双胶合透镜消除色差的实例
  18. SpringMVC的执行流程源码分析?
  19. php 下载 网站 文件,php中下载网站文件
  20. Excel2016绘图新功能

热门文章

  1. 在 Android 系统源码中自定义系统服务(Custom System Service in AOSP)
  2. 如何压缩Json格式数据,减少Json数据的体积?
  3. ubuntu 安装rabbitsvn
  4. 自己写的免费的pdf拆分工具
  5. Pointet++ Tutorial
  6. 小程序截取字符串后三位
  7. ERP中生产计划的分类(转)
  8. 神经网络层次分析模型,神经网络层次分析方法
  9. 多渠道推广场景下,如何实现 App 用户增长的精准归因?
  10. 在ipad上刷android系统更新,全自动刷安卓4.0 索尼SGPT111刷机教程