`

【转】各种 Java Thread State 第一分析法则

阅读更多

使用 TDA 工具,看到大量 Java Thread State 的第一反应是:

 
1,线程状态为“waiting for monitor entry”:
意味着它 在等待进入一个临界区 ,所以它在”Entry Set“队列中等待。
此时线程状态一般都是 Blocked:
  • java.lang.Thread.State: BLOCKED (on object monitor)
 2,线程状态为“waiting on condition”:
说明它在等待另一个条件的发生,来把自己唤醒,或者干脆它是调用了 sleep(N)。
此时线程状态大致为以下几种:
  • java.lang.Thread.State: WAITING (parking):一直等那个条件发生;
  • java.lang.Thread.State: TIMED_WAITING (parking或sleeping):定时的,那个条件不到来,也将定时唤醒自己。
3,如果大量线程在“waiting for monitor entry”:
可能是一个全局锁阻塞住了大量线程。
如果短时间内打印的 thread dump 文件反映,随着时间流逝,waiting for monitor entry 的线程越来越多,没有减少的趋势,可能意味着某些线程在临界区里呆的时间太长了,以至于越来越多新线程迟迟无法进入临界区
 
4,如果大量线程在waiting on condition”:
可能是它们又跑去获取第三方资源,尤其是第三方网络资源,迟迟获取不到Response,导致大量线程进入等待状态。
所以如果你发现有大量的线程都处在 Wait on condition,从线程堆栈看,正等待网络读写,这可能是一个网络瓶颈的征兆,因为网络阻塞导致线程无法执行。
 

线程状态为“in Object.wait()”:
说明它获得了监视器之后,又调用了 java.lang.Object.wait() 方法
每个 Monitor在某个时刻,只能被一个线程拥有,该线程就是 “Active Thread”,而其它线程都是 “Waiting Thread”,分别在两个队列 “ Entry Set”和 “Wait Set”里面等候。在 “Entry Set”中等待的线程状态是 “Waiting for monitor entry”,而在 “Wait Set”中等待的线程状态是 “in Object.wait()”。
当线程获得了 Monitor,如果发现线程继续运行的条件没有满足,它则调用对象(一般就是被 synchronized 的对象)的 wait() 方法,放弃了 Monitor,进入 “Wait Set”队列。
此时线程状态大致为以下几种:
  • java.lang.Thread.State: TIMED_WAITING (on object monitor);
  • java.lang.Thread.State: WAITING (on object monitor);
一般都是RMI相关线程(RMI RenewClean、 GC Daemon、RMI Reaper),GC线程(Finalizer),引用对象垃圾回收线程(Reference Handler)等系统线程处于这种状态。
 
Java Monitor
 
图1 A Java Monitor
 
示范一:
下面这个线程在等待这个锁 0x00000000fe7e3b50,等待进入临界区:
"RMI TCP Connection(64896)-172.16.52.118" daemon prio=10 tid=0x00000000405a6000 nid=0x68fe waiting for monitor entry [0x00007f2be65a3000]
   java.lang.Thread.State: BLOCKED (on object monitor)
at com.xyz.goods.service.impl.GoodsServiceImpl.findChanellGoodsCountWithCache(GoodsServiceImpl.java:1734)
- waiting to lock <0x00000000fe7e3b50> (a java.lang.String)

那么谁持有这个锁呢?
是另一个先调用了 findChanellGoodsCountWithCache 函数的线程:
"RMI TCP Connection(64878)-172.16.52.117" daemon prio=10 tid=0x0000000040822000 nid=0x6841 runnable [0x00007f2be76b3000]
   java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
- locked <0x00000000af4ed638> (a java.io.BufferedInputStream)
at org.bson.io.Bits.readFully(Bits.java:35)
at org.bson.io.Bits.readFully(Bits.java:28)
at com.mongodb.Response.<init>(Response.java:35)
at com.mongodb.DBPort.go(DBPort.java:110)
- locked <0x00000000af442d48> (a com.mongodb.DBPort)
at com.mongodb.DBPort.go(DBPort.java:75)
- locked <0x00000000af442d48> (a com.mongodb.DBPort)
at com.mongodb.DBPort.call(DBPort.java:65)
at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:202)
at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:296)
at com.mongodb.DB.command(DB.java:152)
at com.mongodb.DBCollection.getCount(DBCollection.java:760)
at com.mongodb.DBCollection.getCount(DBCollection.java:731)
at com.mongodb.DBCollection.count(DBCollection.java:697)
at com.xyz.goods.manager.MongodbManager.count(MongodbManager.java:202)
at com.xyz.goods.service.impl.GoodsServiceImpl.findChanellGoodsCount(GoodsServiceImpl.java:1787)
at com.xyz.goods.service.impl.GoodsServiceImpl.findChanellGoodsCountWithCache(GoodsServiceImpl.java:1739)
- locked <0x00000000fe7e3b50> (a java.lang.String)
示范二:
等待另一个条件发生来将自己唤醒:
"RMI TCP Connection(idle)" daemon prio=10 tid=0x00007fd50834e800 nid=0x56b2 waiting on condition [0x00007fd4f1a59000]
   java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
parking to wait for  <0x00000000acd84de8> (a java.util.concurrent.SynchronousQueue$TransferStack)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198)
at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:424)
at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:323)
at java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:874)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:945)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:662)
1)“TIMED_WAITING (parking)”中的 timed_waiting 指等待状态,但这里指定了时间,到达指定的时间后自动退出等待状态;parking指线程处于挂起中。
2)“waiting on condition”需要与堆栈中的“parking to wait for  <0x00000000acd84de8> (a java.util.concurrent.SynchronousQueue$TransferStack)” 结合来看。首先,本线程肯定是在等待某个条件的发生,来把自己唤醒。其次,SynchronousQueue 并不是一个队列,只是线程之间移交信息的机制,当我们把一个元素放入到 SynchronousQueue 中时必须有另一个线程正在等待接受移交的任务,因此这就是本线程在等待的条件。
 
示范三:
"RMI RenewClean-[172.16.50.182:4888]" daemon prio=10 tid=0x0000000040d2c800 nid=0x97e in Object.wait() [0x00007f9ccafd0000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x0000000799b032d8> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
- locked <0x0000000799b032d8> (a java.lang.ref.ReferenceQueue$Lock)
at sun.rmi.transport.DGCClient$EndpointEntry$RenewCleanThread.run(DGCClient.java:516)
at java.lang.Thread.run(Thread.java:662)
 
分享到:
评论

相关推荐

    各种 Java Thread State 第一分析法则 - 旁观者 - 博客园

    各种 Java Thread State 第一分析法则

    53.基于单片机的电子琴设计(仿真+实物).pdf

    53.基于单片机的电子琴设计(仿真+实物).pdf

    鸿蒙系统开发指南:多设备协同应用开发及其未来展望

    内容概要:本文详细介绍了鸿蒙系统的背景、发展现状以及其独特的分布式架构和多设备协同能力,重点讲述了鸿蒙开发的核心技术和应用场景。具体包括鸿蒙系统的微内核设计、弹性部署以及轻量化服务等特点,开发工具和环境的搭建步骤,鸿蒙应用架构中的 Ability 组件及其实现多设备协同的具体代码实例。此外,还通过对高德地图和 WPS 移动版的实际案例解析,展示了鸿蒙开发的实用性和优势。 适合人群:有意愿从事鸿蒙开发工作的开发者、研究人员和相关行业从业者。 使用场景及目标:帮助读者深入了解鸿蒙系统的特性和优势,掌握鸿蒙应用开发的基本技能,从而为未来的智能设备开发打下坚实的基础。同时鼓励更多人参与到鸿蒙生态建设中来,共同推动我国自主知识产权操作系统的创新发展。 阅读建议:本文不仅讲解了理论概念,还结合具体案例进行实战指导,建议读者结合实践操作加深理解。尤其是对鸿蒙系统特有的分布式架构要有透彻的理解,并关注最新的技术和政策变化以便抓住行业发展契机。

    高阶扰动多智能体系统下基于积分滑模控制器与线性一致性的领导跟随共识协议研究及应用(可复现,有问题请联系博主)

    内容概要:论文聚焦于解决多智能体系统(MAS)中由于多个时变通信延迟导致的输出一致性问题。作者提出了一种新的最优分布控制方法,通过引入积分滑模控制器和带常权重的线性一致性方案,实现了对网络拓扑下干扰系统的有效控制。论文利用李雅普诺夫-克拉索夫斯基泛函以及线性矩阵不等式来证明闭环稳定性和收敛特征。还介绍了优化算法,旨在找到使系统最大容许输入延迟上界的最优解及其相应参数调优。 适用人群:具备自动化工程、电气数学背景的研究人员和技术开发人员,特别适合对MAS控制系统设计感兴趣的学者及工程师。 使用场景及目标:针对存在时间变异通讯延迟和不确定性外扰条件下的大规模智能交互系统提供有效的分布式鲁棒控制解决方案;旨在提高实际工业系统如电力网路或机器人集群的应用性能。 其他说明:文中具体探讨了领导者-跟随者的动态同步模型,在仿真测试中展示了提出的算法即使在有外界噪声扰动条件下仍然能够很好地达到预期的一致性状态。此外,还解决了高频抖振现象并改进了传统方法中难以克服的问题,提供了更为平稳和平稳地控制机制。

    73.基于单片机的简易烘手机设计(实物).pdf

    73.基于单片机的简易烘手机设计(实物).pdf

    华为USG2100 V300R001C10SPC600 (VRP (R) Software, Version 5.30)固件包,512M版本

    华为USG2100 V300R001C10SPC600 (VRP (R) Software, Version 5.30)固件包,512M版本

    基于YOLOV5 的ROS2功能包可以快速完成物体识别与位姿发布 A ROS2 package based on YO.zip

    yolo

    Delphi 12.3控件之DeviceLensSetup-2.1.0.rar

    Delphi 12.3控件之DeviceLensSetup_2.1.0.rar

    tensorboardX可视化实例

    这个主要是前两天写了篇博客代码示例,主要是帮助深度学习新手小白怎样使用tensorboardX可视化数据

    探秘 DeepSeek:解锁提升个人竞争力的 AI 技术密码

    内容概述:DeepSeek 是一家致力于通用人工智能研究和开发的中国公司,其研发的一系列模型在技术和应用上具有独特优势。文章介绍了 DeepSeek 多种模型版本的特点及适用场景,分析了其技术优势在于将 AI 从 “语言模型范式” 推向 “专家模型范式”,具备动态思维链和内置专家模型。同时探讨了在使用 DeepSeek 时提示词的必要性和特点,展示了其在内容创作、编程、搜索资讯、数据分析等方面的应用实例,并给出了提升个人竞争力的方法,如将其当作专家进行深度沟通、优化提示词、结合其他工具使用等。 适用人群 学生群体:在学习过程中,可利用 DeepSeek 进行知识整理、学习笔记制作、获取学习资料以及解决数学等学科问题,辅助学习,提升学习效率和知识掌握程度。 职场人士:如从事电商、营销、编程、数据分析等行业的人员,能借助 DeepSeek 进行深度内容创作、高效编程、市场调研分析、商务汇报撰写等工作,增强工作能力,提升职场竞争力。 对人工智能技术感兴趣的爱好者:可以通过了解 DeepSeek 的技术原理、应用场景和使用方法,深入探索人工智能领域,满足自身对新技术的求知欲。 使用场景 学习场景:学生在准备课程作业、复习知识、进行课题研究时,使用 DeepSeek 获取相关资料,辅助解决学习难题。例如在撰写论文时,利用其进行文献综述和思路拓展。 工作场景:职场中,用于文案策划、代码编写、市场分析报告撰写、项目方案制定等工作。如电商从业者用其设计人工智能通识课程目录,营销人员用其创作营销文案。 日常创作场景:个人进行内容创作,如撰写小说、故事、品牌故事时,借助 DeepSeek 获取灵感和创作思路,提升创作效率和质量。

    deepseek-llm-7b-base 压缩包02

    https://huggingface.co/deepseek-ai/deepseek-llm-7b-base

    多摄像头实时流量和对象计数与YOLO v4深度排序和Flask.zip

    yolo

    计算机科学导论项目一:基于BBC Micro:bit的音频/视觉摩尔斯电码应用的设计与实现(可复现,有问题请联系博主)

    内容概要:本文档介绍了针对大学本科计算机科学专业学生的入门计算项目之一——设计并实现一个音频/视觉摩尔斯电码应用程序。项目的重点在于利用BBC Micro:bit硬件平台及其LED矩阵显示功能来编码和解码文字到摩尔斯电码。项目任务分为几个步骤完成:定义摩尔斯电码转换规则、创建文本到摩尔斯电码及反之的函数、为每个字母创建特定的LED点亮模式,并将其集成到实际应用中以实现交互性和趣味性的增加。评估标准包括程序代码的完整性、相关函数建立的有效性、代码注释的质量以及项目的文档记录。 适合人群:主要面向修读计算机科学导论课程的本科一年级学生或者其他对嵌入式系统编程感兴趣的开发者和技术爱好者。 使用场景及目标:此项目适用于学习阶段的学习者,在教师指导下进行编程练习;它还适合作为入门级编程课程的一部分,帮助学员掌握基础编程技巧,如函数构建、逻辑判断、条件分支以及图形化输出等内容。此外,鼓励学生探索不同的互动形式来启动程序(按钮按压、摇晃装置)和增强用户体验的方式。 其他说明:评估将以提交的一份报告或者演示视频为基础,详细列出从概念构思直至最终成果的所有细节,并附有必要的参考资料和支持材料链接。同时还

    集yolov5centernetunet算法的pyqt5界面可实现图片目标检测和语义分割.zip

    yolo

    基于matlab实现的无线传感器网络定位+源码+项目文档(毕业设计&课程设计&项目开发)

    基于matlab实现的无线传感器网络定位+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 主函数是算法的整体描述,主要步骤如下: 载入仿真无线传感器网络,包括锚点的位置信息,以及相邻节点之间的距离,这些仿真数据通过 initData.m 实现。 锚点将自身信息通过广播告知网络中其余节点,广播后其余节点均可得到锚点信息和自身距离锚点的最短路径,此步骤通过加权宽度遍历算法实现。 将最短路径作为直接距离,利用多边定位算法将未知节点的位置估计出来。 第 3 步得到的网络图和理论网络图有些区别,我们利用理论网络图相邻节点距离的平方和减去估计理论图相邻节点的平方和得到的值作为两个网络图的相似度,然后根据此进行优化,其中相似度计算由函数 fun() 实现。 利用 fun() 计算出来的相似度,对所有的估计节点进行逐个局部优化,此处的优化使用了 MATLAB 精度估计由 accuracy.m 提供,计算的是相对精度,计算公式为估计坐标和理论坐标的距离除以通信半径。

    基于java的ssm医院打卡挂号系统(含LW+PPT+源码+系统演示视频+安装说明).7z

    本系统采用了jsp技术,将所有业务模块采用以浏览器交互的模式,选择MySQL作为系统的数据库,开发工具选择My eclipse来进行系统的设计。基本实现了系统应有的主要功能模块,本系统有管理员、医生和用户,管理员:个人中心、公告信息管理、用户管理、科室信息管理、医生管理、预约时间段管理、出诊信息管理、在线预约管理、上班打卡管理、留言板管理、系统管理,用户:个人中心、在线预约管理、我的收藏管理。医生:个人中心、出诊信息管理、在线预约管理、上班打卡管理。前台首页:首页、公告信息、科室信息、出诊信息、留言反馈、我的、跳转到后台等操作。 对系统进行测试后,改善了程序逻辑和代码。同时确保系统中所有的程序都能正常运行,所有的功能都能操作,并且该系统有很好的操作体验,实现了对于系统和医院双赢。 关键词:医院挂号系统;jsp;Mysql;

    毕业设计pytorch基于卷积神经网络的面部表情识别项目源代码+模型数据+使用文档

    毕业设计pytorch基于卷积神经网络的面部表情识别项目源代码+模型数据+使用文档 该项目实现对捕捉到人脸进行表情识别,并制作两种形式: 实时识别 截图识别(拓展) 该项目一共设置7种表情类型: anger(生气) disgust(厌恶) fear(恐惧) happiness(高兴) neutral(中性) sadness(悲伤) surprise(惊喜)

    270.基于51单片机的电子钟【调时,DS1302,数码管,独立按键】(仿真).pdf

    270.基于51单片机的电子钟【调时,DS1302,数码管,独立按键】(仿真).pdf

    4.C语言程序设计--商品信息管理.pdf

    4.C语言程序设计--商品信息管理.pdf

    Delphi 12.3控件之Delphi 12 ios,android,mswindows获取设备唯一标识符和mac地址.rar

    Delphi 12.3控件之Delphi 12 ios,android,mswindows获取设备唯一标识符和mac地址.rar

Global site tag (gtag.js) - Google Analytics