jvm(java虚拟机)线程堆栈jstack(2)
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)相关推荐
- java线程堆栈_深入JVM剖析Java的线程堆栈
在这篇文章里我将教会你如何分析JVM的线程堆栈以及如何从堆栈信息中找出问题的根因.在我看来线程堆栈分析技术是Java EE产品支持工程师所必须掌握的一门技术.在线程堆栈中存储的信息,通常远超出你的想象 ...
- JVM(java 虚拟机)
JVM(java 虚拟机) 一.JVM简介 1.JVM:Java Virtual Machine (java 虚拟机) 通过软件来模拟出来的具有完整的硬件系统功能.运行在完全隔离的环境中的完整的计算机 ...
- 深入理解java虚拟机--线程安全与锁优化
深入理解java虚拟机--线程安全与锁优化 面向过程编程思想和面向对象编程思想 java语言中的线程安全 线程安全的实现方法 锁优化 面向过程编程思想和面向对象编程思想 面向过程编程思想:站在计算机的 ...
- java虚拟机线程调优与底层原理分析_啃碎并发(七):深入分析Synchronized原理...
原标题:啃碎并发(七):深入分析Synchronized原理 前言 记得开始学习Java的时候,一遇到多线程情况就使用synchronized,相对于当时的我们来说synchronized是这么的神奇 ...
- JavaEE - JVM Java虚拟机
JVM 大家重点掌握的是垃圾回收算法(引用计数+可达性分析+标记清除+标记整理+复制算法+分代回收) 课程目标: 1. 了解 JVM 的发展史 2. 了解 JVM 运行原理 3. 掌握 JVM 基本组 ...
- java打印线程堆栈_Java问题定位之Java线程堆栈分析
采用Java开发的大型应用系统越来越大,越来越复杂,很多系统集成在一起,整个系统看起来像个黑盒子.系统运行遭遇问题(系统停止响应,运行越来越慢,或者性能低下,甚至系统宕掉),如何速度命中问题的根本原因 ...
- JVM(JAVA虚拟机)、DVM(Dalvik虚拟机)和ART虚拟机
一.什么是DVM,和JVM有什么不同? JVM是Java Virtual Machine,而DVM就是Dalvik Virtual Machine,是安卓中使用的虚拟机,所有安卓程序都运行在安卓系统进 ...
- [JVM] java虚拟机 堆
1.概念 Java 虚拟机所管理的内存中最大的一块,Java 堆是所有线程共享的一块内存区域,在虚拟机启动时创建.此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存. J ...
- JVM——Java虚拟机架构
Java虚拟机(Java virtualmachine)实现了Java语言最重要的特征:即平台无关性. 平台无关性原理:编译后的 Java程序(.class文件)由 JVM执行.JVM屏蔽了与具体平台 ...
最新文章
- poj 1515+poj 1438(边双连通)
- 使用中断后不停止_仓鼠偷吃鼠粮,被发现后立刻停止,但鼠鼠满脸不情愿
- Linux : shell基础(慕课网Linux达人养成计划课程笔记)
- python-while循环-基本格式
- 「BZOJ 2142」礼物
- 惠普打印机墨盒更换教程_惠普打印机怎么换墨盒 一不小心就洒了一桌子墨水...
- 你连阶级固化的原因都搞不清,又凭什么不被固化在底层?
- 助力网络安全发展,安全态势攻防赛事可视化
- 重磅公开!集14位名师教案的《最全高中数学解题思想方法汇编》
- [14] 胜利大逃亡
- 【CubeMX配置STM32的ADC】
- 首屏加载,与less的初始化css
- 【c++入门(2)】贪心训练
- 现如今99%的区块链都是空气项目
- java enum枚举类的用法以及高级玩法
- 58同城python_Python实战计划爬虫作业第一周作业:爬58同城
- Zemax学习笔记(9)- 双胶合透镜消除色差的实例
- SpringMVC的执行流程源码分析?
- php 下载 网站 文件,php中下载网站文件
- Excel2016绘图新功能