常见的线程状态:
RUNNABLE:正在执行的线程
注意:这里执行是针对jvm来说的,并非真的在cpu上执行,这要看操作系统处理器是否有机会
BLOCKED:阻塞的线程
注意:阻塞的线程一般是拿不到监视器锁(a monitor lock),比如:synchronized block/method,ReentrantLock.lock()
jstack一般显示为:
"Thread-0" prio=6 tid=0x000000000b67f800 nid=0x40d0 waiting on condition [0x000000000da7f000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at Test$1.run(Test.java:26)
- locked <0x00000007d5df43f8> (a java.util.HashMap)
"main" prio=6 tid=0x00000000021cf000 nid=0x1870 waiting for monitor entry [0x000000000262f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at Test.test1(Test.java:39)
- waiting to lock <0x00000007d5df43f8> (a java.util.HashMap)
at Test.main(Test.java:7)
分析:
Thread-0:
1、拿到了锁并且没有释放:locked <0x00000007d5df43f8> (a java.util.HashMap)
2、线程调用了sleep方法,java.lang.Thread.State: TIMED_WAITING (sleeping)
main线程:
1、java.lang.Thread.State: BLOCKED (on object monitor):因为锁被Thread-0 占用,拿不到锁( waiting for monitor entry),进入 BLOCKED 状态
2、waiting to lock <0x00000007d5df43f8> (a java.util.HashMap):首先锁的编号是:0x00000007d5df43f8,锁的对象是HashMap (a java.util.HashMap)
总结:
1、这种方式可以轻松分析出来 BLOCKED 的线程是被那个锁阻塞的
2、从代码的输出可以看出:线程Thread-0 持有锁,进入sleep后,不会释放锁,否则main线程的(##############) 会输出
3、echo "obase=10;ibase=16;40D0"|bc ; 输出为:16592,可以定位线程id
java 代码为:
private static void test1() throws Exception { final Map<String, User> map = new HashMap<String, User>(); new Thread() { @Override public void run() { synchronized (map) { try { System.out.println("***************"); System.out.println("map: " +Long.toHexString(map.hashCode())); System.out.println("map: " +(map)); System.out.println("newThread: " +(Thread.currentThread().getId())); System.out.println("newThread: " +Long.toHexString(Thread.currentThread().getId())); System.out.println("newThread: " +Long.toHexString(Thread.currentThread().hashCode())); Thread.sleep(10000000); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); Thread.sleep(10000); System.out.println("mainThread: " +(Thread.currentThread().getId())); System.out.println("mainThread: " +Long.toHexString(Thread.currentThread().getId())); System.out.println("mainThread: " +Long.toHexString(Thread.currentThread().hashCode())); synchronized (map) { System.out.println("##############"); map.wait(); } int i = 0; while (true) { map.put("value" + i, new User(i)); i++; if (map.size() > 1000000) { map.clear(); } } }
输出:
***************
map: 0
map: {}
newThread: 9
newThread: 9
newThread: 64afb650
mainThread: 1
mainThread: 1
mainThread: 138b9a72
WAITING:等待状态
一般以下三种调用:
Object.wait with no timeout
Thread.join with no timeout
LockSupport.park
jstack一般显示为:
"Thread-0" prio=6 tid=0x000000000d447000 nid=0x31b8 in Object.wait() [0x000000000da8f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007d5df43f8> (a java.util.HashMap)
at java.lang.Object.wait(Object.java:503)
at Test$2.run(Test.java:65)
- locked <0x00000007d5df43f8> (a java.util.HashMap)
"main" prio=6 tid=0x000000000238f000 nid=0x372c in Object.wait() [0x000000000279f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007d5df43f8> (a java.util.HashMap)
at java.lang.Object.wait(Object.java:503)
at Test.test2(Test.java:78)
- locked <0x00000007d5df43f8> (a java.util.HashMap)
at Test.main(Test.java:7)
分析:
1、Thread-0 和 main 线程 都是因为调用 wait() 方法 进入阻塞的
2、他们都拿到了锁:locked <0x00000007d5df43f8> (a java.util.HashMap)
3、java.lang.Thread.State: WAITING (on object monitor):他们都在等待 对象监视器(on object monitor)的通知
4、从代码的输出可以看出:线程进入wait后,会释放锁,否则(##############) 不会输出
5、0x000000000da8f000,0x000000000279f000 的值的含义为:线程的起始栈地址
java代码:
private static void test2() throws Exception { final Map<String, User> map = new HashMap<String, User>(); new Thread() { @Override public void run() { synchronized (map) { try { System.out.println("***************"); System.out.println("newThread: " +Long.toHexString(Thread.currentThread().getId())); System.out.println("newThread: " +Long.toHexString(Thread.currentThread().hashCode())); map.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); Thread.sleep(10000); System.out.println("mainThread: " +Long.toHexString(Thread.currentThread().getId())); System.out.println("mainThread: " +Long.toHexString(Thread.currentThread().hashCode())); synchronized (map) { System.out.println("##############"); map.wait(); } int i = 0; while (true) { map.put("value" + i, new User(i)); i++; if (map.size() > 1000000) { map.clear(); } } }
输出:
***************
newThread: 9
newThread: 517c804b
mainThread: 1
mainThread: 138b9a72
##############
TIMED_WAITING:等待特定时间
情况分析(Block的时候已经有说明)
Thread.sleep
Object.wait with timeout
Thread.join with timeout
LockSupport.parkNanos
LockSupport.parkUntil
jvm的线程的状态定义如下:
public enum State { /** * Thread state for a thread which has not yet started. */ NEW, /** * Thread state for a runnable thread. A thread in the runnable * state is executing in the Java virtual machine but it may * be waiting for other resources from the operating system * such as processor. */ RUNNABLE, /** * Thread state for a thread blocked waiting for a monitor lock. * A thread in the blocked state is waiting for a monitor lock * to enter a synchronized block/method or * reenter a synchronized block/method after calling * {@link Object#wait() Object.wait}. */ BLOCKED, /** * Thread state for a waiting thread. * A thread is in the waiting state due to calling one of the * following methods: * <ul> * <li>{@link Object#wait() Object.wait} with no timeout</li> * <li>{@link #join() Thread.join} with no timeout</li> * <li>{@link LockSupport#park() LockSupport.park}</li> * </ul> * * <p>A thread in the waiting state is waiting for another thread to * perform a particular action. * * For example, a thread that has called <tt>Object.wait()</tt> * on an object is waiting for another thread to call * <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on * that object. A thread that has called <tt>Thread.join()</tt> * is waiting for a specified thread to terminate. */ WAITING, /** * Thread state for a waiting thread with a specified waiting time. * A thread is in the timed waiting state due to calling one of * the following methods with a specified positive waiting time: * <ul> * <li>{@link #sleep Thread.sleep}</li> * <li>{@link Object#wait(long) Object.wait} with timeout</li> * <li>{@link #join(long) Thread.join} with timeout</li> * <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li> * <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li> * </ul> */ TIMED_WAITING, /** * Thread state for a terminated thread. * The thread has completed execution. */ TERMINATED; }
相关推荐
主要介绍了JVM---jstack分析Java线程CPU占用,线程死锁的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
二、此工具线程的几种状态 1.死锁,Deadlock(重点关注) 2.执行中,Runnable(重点关注) 3.等待资源,Waiting on condition(重点关注) 4.等待监控器检查资源,Waiting on monitor 5.暂停,Suspended ...
Java线程转储分析器 这是用Java编写的Java线程转储分析器。 它基于的。 有关用法的其他信息,请参见 。 执照 Java Thread Dump Analyzer是根据。 版权所有2014-2016 Spotify AB 版权所有2016-2018 MP Objects BV...
都有及时生成所有线程在某一点状态的 thread-dump 的能力,虽然各个 Java 虚拟机打印的thread dump 略有不同,但是大多都提供了当前活动线程的快 照,及JVM 中所有 Java线程的堆栈跟踪信息,堆栈信息一般包含完整的...
java程序性能分析thread dump和heap dump,dump文件:在故障定位(尤其是out of memory)和性能分析的时候,dump文件记录了JVM运行期间的内存占用、线程执行等情况。 heap dump:记录某一时刻JVM堆中对象使用情况,哪些...
/ 327 12.3.5 原子性、可见性与有序性 / 328 12.3.6 先行发生原则 / 330 12.4 Java与线程 / 333 12.4.1 线程的实现 / 333 12.4.2 Java线程调度 / 337 12.4.3 状态转换 / 339 12.5 本章小结 / 341 第13章 ...
第55节虚拟机工具-jstack详解00:10:19分钟 | 第56节可视化虚拟机工具-Jconsole内存监控00:07:09分钟 | 第57节可视化虚拟机工具-Jconsole线程监控00:12:18分钟 | 第58节死锁原理以及可视化虚拟机工具-Jconsole线程...
JVM是Java知识体系中的重要部分,对JVM底层的了解是每一位Java程序员深入Java技术领域的重要因素。本课程试图通过简单易懂的方式,系统的深入讲解JVM相关知识。包括JVM执行过程、虚拟机类加载机制、运行时数据区、GC...
jstack生成的Thread Dump日志.docx 系统线程状态 (Native Thread Status) 系统线程有如下状态: ...死锁线程,一般指多个线程调用期间进入了相互资源占用,导致一直等待无法...JVM线程运行状态 (JVM Thread Status)
线上Java应用,在业务高峰期的时候经常出现CPU跑高,需要查看实时的线程占用cpu情况,下面是一个很好用的脚本,可以快速导出每个线程的占用CPU情况,结合jstack日志,排查到具体的线程类名。 一、首先获得jvm的进程...
jstack(线程、死循环、死锁):alien: JVisualVM(本地和远程可视化监控:alien: 使用 BTrace进行拦截调试:alien: Tomcat 性能监控与调优:alien: Nginx 性能监控与调优:alien: JVM 层 GC 调优:alien: JAVA代码层调优:...
• 熟悉Java多线程并发中线程基本方法,线程池,线程生命周期,熟悉Java锁中常见锁分类(乐观/悲观锁、自旋锁、独/共享锁、可重入锁、公平/非公平锁、分段锁、偏向锁,轻/重量级锁)和基本的锁升级策略
Java生产环境下性能监控与调优详解视频... jstack与线程的状态 MAT 分析内存溢出的方法 可视化工具分析GC日志 通过这套视频学习如何在生产环境下进行性能监控与调优。 视频在百度网盘中,txt下载后获取网盘链接下载
主要是Java后端的,16K左右的,涉及SE、WEB、三大框架SSM、springboot、MQ、数据库、springcloud、JVM、Redis、多线程、hashmap的底层、面试技巧等 SSM涉及浅层的底层,如IOC、AOP,专为没看过源码的人应付面试准备...
3.对Java虚拟机、JMM、垃圾收集机制、GC算法、JVM常用配置参数、GC参数、classLoader、锁机制、JVM故障分析,jmap,jstack等jdk提供的工具命令,性能监控工具(java visualVM),JVM参数调优有一定了解; 4.熟悉java...
学习Java需要掌握基本语法和面向对象的思想,了解JVM、多线程、网络编程等基础知识。 学习Java的技巧包括: - 多写代码,尤其是Web开发、框架使用等; - 阅读Java优秀的开源项目源代码; - 学习Java8及其以上的新...
多线程问题定位:jstack快照所有线程;dump导出;使用jvisualvm分析dump文件 JVM分析:日志开启;GC日志打印;GC分析 7.服务器问题 现象:CPU使用率高;内存使用率高;磁盘满生成文件失败;连接第三方接口...
在基于POSIX的系统(例如Linux)上请求线程转储的最简单方法是发送kill -3信号,该信号无损地暂停JVM,创建线程转储,然后JVM继续(暂停通常为几百毫秒最多)。例如(用Java进程的进程ID替换$ {PID}):
问题描述: cpu占用过高,服务器卡死,问题排查 ...3、使用 printf ‘%x\n’ PID (PID为上一步中获取到的线程号)转换成对应的16进制PID 5c7e(为什么要转换,因为用jstack工具导出的信息里面线程对应的nid是1
4.2.6 jstack:Java堆栈跟踪工具 4.2.7 HSDIS:JIT生成代码反汇编 4.3 JDK的可视化工具 4.3.1 JConsole:Java监视与管理控制台 4.3.2 VisualVM:多合一故障处理工具 4.4 本章小结 第5章 调优案例分析与实战 ...