大数跨境

Java项目性能瓶颈分析及定位(九)——Java线程堆栈分析(六)

Java项目性能瓶颈分析及定位(九)——Java线程堆栈分析(六) 慧测
2017-09-04
1
导读:Java项目性能瓶颈分析及定位系列文章——Java线程状态深入解析

扫码报名慧测Selenium系列公开课


慧测近期开班

9月10日——性能测试

9月16日——测试开发


借助线程堆栈, 可以分析很多类型的问题, CPU的消耗分析即是线程堆栈分析的一个重要内容。 本篇介绍如何解读线程堆栈的状态信息。

Java线程状态有如下几类:

1、NEW

线程刚被创建的时候就是NEW的状态,上代码:

2、RUNNABLE

从虚拟机的角度,线程处于可运行状态。


那么处于RUNNABLE的线程是不是一定消耗CPU呢?实际上不一定。下面的线程堆栈表示该线程正在从网络读取数据,尽管下面这个线程显示RUNNABLE状态,但实际上网络IO,线程绝大多数时间是被挂起,只有当数据到达之后,线程才被重新唤醒。


挂起发生在本地代码(Native)中,虚拟机根本不知道,不像显式调用了Java的sleep()或者wait()等方法,虚拟机能知道线程的真正状态,但对于本地代码中的挂起,虚拟机无法真正地知道线程状态,因此它一概显示为RUNNABLE。像这种socket IO操作,不会消耗大量的CPU,因为大多时间在等待,只有数据到来之后,才消耗一点点CPU。

再通俗的解释一下,拿张三、李四、王五他们一起修电脑来举个例子:

张三把修电脑这个任务交给李四去干:


(李四——JVM中的线程,王五——本地线程)

1)如果李四接到任务之后自己马上开始干活,这个时候李四反馈给张三的状态就是RUNNABLE,也就是说张三看到的李四的状态和李四的实际状态是一致的,李四真的很忙。那么这时候的RUNNABLE就比较消耗CPU。


2)如果李四接到任务后发现这个活自己干不了,他就把这个任务交给王五去干,这个时候李四反馈给张三的状态也是RUNNABLE,但是王五是否真的在修电脑,张三就不知道了,所以尽管张三看到李四的状态是RUNNABLE,但也未必消耗CPU。


下面的代码就会消耗CPU:


3、BLOCKED

处于BLOCKED状态的线程是不消耗CPU的!


两个线程以上,相互等待synchronized块


简单解释一下上面的代码:

两个线程:t1和t2


假设t1线程被优先运行,t1执行完第56行代码后,就把下面的代码给锁住了,接下来t1会休眠10秒钟,在这期间锁lock是没有被释放的。


接下来t2开始运行,t2线程执行输出“慧测欢迎您”之后,就要去执行56行代码,来获取lock这个锁对象,但是锁仍然被t1所拥有,在这个时刻t2线程的状态就是BLOCKED。

WAITING和TIMED_WAITING状态的代码稍微多些,下次继续哦!



价值3000元的Selenium自动化测试即将免费登场——

就在2017年9月13日晚上20:30分


本系列公开课报名地址:

https://ke.qq.com/course/237510#tuin=3e1d63a

或者扫描下方二维码:




慧测官网:www.huicewang.com
慧测公开课服务群: 623636110

咨询QQ:2657535456

公众号:慧测


【声明】内容源于网络
0
0
慧测
专注人工智能前沿技术落地企业实战应用
内容 404
粉丝 0
慧测 专注人工智能前沿技术落地企业实战应用
总阅读104
粉丝0
内容404