jvm调节

Java Thread Dump 分析 诊断 Java 应用的过程中, 我们经常要去看线程的相关信息. 比如当前 JVM 有多少线程, 从启动到现在已经创建过多少线程, 线程的 CPU 使用率, 线程是不是发生了死锁, CPU 使用率过高是哪些代码导致的. 这要求我们对 Java 的线程必须有一定的了解, 才能比较有针对性的分析这些问题. 下面我们就从分析 Thread dump 开始介绍 Thread 相关的信息. 阅读详情
使用  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)
 
参考资源:
1)CUBRID,2012, How to Analyze Java Thread Dumps;
赠图一枚:
【java】死锁产生分析与检测分析工具 最近在看了一些关于多线程死锁分析的博客,在死锁的分析方面有了一点自己的经验,下面将它总结记录下来。 1. 死锁简介 1.1 死锁的产生 1.2 线程 1.3 锁 2. 死锁举例 3. 死锁分析 3.1 VisualVM简介 3.2 VisualVM中插件安装 3.3 线程监视 3.4线程dump分析 3.5 Dump内容分析 3.6 利用Thread Dumps Anal... 阅读详情

相关推荐

又一次Java线程卡死的调试经历

我的java代码,每天凌晨1点都会执行一个定时任务,定时任务中有循环执行的任务,每次循环都有开始和结束日志,某一天,我忽然发现,日志中前一天的循环只执行了几次就停止了,根据日志来看,执行到第4次循环的时候,只有开始的日志,没有结束的日志,那肯定是在里面卡死了 我首先执行 # ps -ef | grep tomcat 获取到了线程的pid 然后执行jstack # jstack -l 1...

u011734144的专栏 6万+

线程异常WAITING(parking)

项目中线程数量持续增长,且基本无法回收关闭,线程数量一直累积达到几万,影响CPU开销和性能,导致服务器卡死

qq_38783304的博客 1万+

Clock Gating设计陷阱:为什么你的ICG cell总是导致setup violation?(附解决方案)

本文深入分析了数字IC设计中ICG(Integrated Clock Gating)单元导致setup时序违规的常见问题,包括时钟偏斜和数据路径过长两大核心原因。通过量化分析影响因素,提供了逻辑重组、寄存器重定时等优化策略,并介绍了预防性设计方法和物理实现阶段的优化技巧,帮助工程师有效解决ICG相关的setup violation问题。

weixin_29168153的博客 207

服务器跑着跑着线程池都挂了java.lang.Thread.State: TIMED_WAITING (parking)

java.lang.Thread.State: TIMED_WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x00000000af662cf0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.

mysql数据库 innodb存储引擎怎么创建好索引 2万+

【实战解析】RTL8306MB交换芯片驱动开发中的RMII接口调试陷阱

本文通过一个RTL8306MB交换芯片驱动开发的实战案例,深入剖析了RMII接口调试中的经典陷阱。文章详细描述了因TX_EN与CRS_DV信号线交叉连接错误导致的“静默”故障,并分享了使用逻辑分析仪和示波器进行硬件排查的完整流程与核心技巧,为嵌入式网络驱动开发提供了宝贵的避坑指南。

weixin_29267307的博客 422

ESP32开发环境与微信小程序通信的完整示例

通过搭建稳定的esp32开发环境,实现其与微信小程序间的双向通信,涵盖Wi-Fi连接、数据收发与协议设计,为物联网应用提供低成本解决方案。

weixin_42126677的博客 1135

spark如何调节jvm的连接等待时长

后,宣告数据拉取失败,如果反复尝试都拉取不到数据,可能会导致Spark 作业的崩溃。在生产环境下,有时会遇到file not found、file lost 这类错误,在这种情况下,很有可能是Executor 的BlockManager 在拉取数据的时候,无法建立连接,然后超过默认的连接等待时长。,该参数控制 Application Master(AM)向 Resource Manager(RM)请求资源时的轮询等待时间(单位:毫秒)。通过调整此参数,可优化 JVM 在资源请求阶段的连接等待行为。

2301_80954266的博客 534

【100%通过率】华为OD机试真题 Python 实现【网上商城优惠活动 / 模拟商场优惠打折II】

某网上商场举办优惠活动,发布了满减、打折、无门槛3种 优惠券,分别为: 1:每满100元优惠10元,无使用数限制,如100~199元可以使用1张减10元,200~299可使用2张减20元,以此类推; 2:92折券,1次限使用1张,如100元,则优惠后为92元, 3:无门槛5元优惠券,无使用数限制,直接减5元。

MISAYAONE的博客 9373

《九》JVM调优之调节executor堆外内存与连接等待时长

u011500419的专栏 117

【WRF工具】WRF 模型输出可视化工具 plotfmt

【WRF工具】WRF 模型输出可视化工具 plotfmt

WW、forever的博客 1292

基于 STM32 的智慧图书馆智能控制系统设计与实现

智慧图书馆智能控制系统集成环境调控、安全监控、借阅管理与信息推送功能,通过 STM32 主控芯片联动传感器、执行器及云平台,实现图书馆智能化管理。系统架构分为感知层(传感器)、控制层(STM32 主控)、执行层(继电器 / 显示屏)及云端层(数据交互),支持温度自动调节、灯光自控、火情安防监控、天气推送及 RFID 借还书管理。本系统通过 STM32 实现多传感器融合与设备控制,结合 RFID 与云平台技术,构建了集环境智能调控、安全监控、便捷借阅于一体的智慧图书馆解决方案。

weixin_42300449的博客 2211

JVM的Heap的内存调优,并通过调节Heap的大小实现OOM异常

IDEA上调节JVM的大小 参数:-Xms:初始的堆内存的容量大小(默认电脑内存的1/64) -Xmx:最大堆内存的大小,(默认电脑内存容量的1/4) 代码查看:初始JVM的内存大小: package com.thekingqj; import org.omg.SendingContext.RunTime; import java...

私は悪い人ですか的博客 569

三维重建(十八)——colmap的使用(粗浅)

三维重建(十八)——colmap的使用(粗浅)

河海大学研究生在读的学习笔记 1378

JVM内存比例调节

我们知道在jdk8之后,堆(heap)分为新生代(Young),老年代(Old),和元空间(Metaspace), 新生代又分为Eden 和Survivor1、Survivor2三个区域(Survivor1对应图中s1,Survivor2对应图中s2) 那么新生代中Eden和s1以及s2的比例是多少呢?怎么调节呢? 我们可以去Oracle官网去搜索-XX:SurvivorRatio=ratio 可以得知 伊甸园空间大小和幸存者空间大小之间的比例:为8:1:1 确实是如此吗?我们不妨来验证一下 publ

Java精灵 2401

[Dify实战] 合同审阅助手:识别风险条款、生成修改建议-带绑定资源

摘要: Dify合同审阅助手通过AI技术提升合同审阅效率,快速识别风险条款并输出结构化修改建议。方案包括合同输入、关键条款识别、风险评级和报告生成流程,重点关注付款、责任限制等核心条款。采用分层风险分级(高/中/低)和"红线清单"机制,确保审阅标准化。实施建议先建立条款库和模板,通过样本测试优化模型,定期更新规则库。该方案可缩短审阅时间50%以上,提高风险识别准确率,最终实现法务经验的可复用沉淀。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 600

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

JVM参数调节及类加载

常见参数配置 XX:+PrintGC 每次触发GC的时候打印相关日志 -XX:+UseSerialGC 串行回收 -XX:+PrintGCDetails 更详细的GC日志 -Xms 堆初始值 -Xmx 堆最大可用值 -XX:NewSize(-Xns) 年轻代内存初始大小 -Xss 设置栈大小 -XX:MaxNewSize...

Damon_zqt的博客 693

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

linux 调节tomcat jvm 参数

Tomcat并不建议直接在catalina.sh里配置变量,而是写在与catalina同级目录(bin目录)下的setenv.sh里。 所以如果我们想要修改jvm的内存配置,那么我们就需要修改setenv.sh文件(默认没有,需新建一个setenv.sh),写入(大小根据自己情况修改):setenv.sh内容如下:   export CATALINA_OPTS="$CATALIN...

萌萌的土拨鼠 1625

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

JVM调优对Full GC的调节

JVM调优对Full GC的调节

小贾的博客 458

如何调节idea jvm的最大内存_2-JVM内存结构

内存结构方法区JDK1.7 之前包含1.7 将方法区称为 Perm Space 永久代JDK1.8之后包含1.8 将方法区称为 MetaSpace 元空间。堆(分配内存会大一些)分配对象、new 实例。堆内存当中划分为两个区域:老年代和新生代。如何去划分老年代和新生代,根据对象的年龄。这个年龄是一个对象经过一次GC,如果还存在的话,年龄就加一。当年龄超过默认值(15)时,就会从新生代划分到老年代当...

weixin_39679664的博客 453

weblogic 启动过程->jdk更改和jvm的调节

weblogic启动 路径-> D:\server\weblogic9\user_projects\domains\base_domain\startWebLogic.cmd startWebLogic.cmd文件: @ECHO OFF @REM WARNING: This file is created by the Configuration Wizard. @REM Any

qq_24451965的博客 727

如何调节idea jvm的最大内存_JVM笔记八-堆参数调优

JVM垃圾收集器(Java Garbage Collection)。本教程均在JDK1.8+HotSpot为例来讲解的.先来看看Java7的:编辑​再来看看Jva8的编辑​从上图中我们可以看出,java8之后换成了元空间。那么怎么证明,堆区是有新生代、永久代、元空间三部分组成的呢?OOM这个错误我们都熟悉,那么怎么手动制造出一个OOM呢?如果16G的物理内存,JVM堆内存能够分到多少G的内存空间呢...

weixin_39886929的博客 649

ELasticsearch控制台中文乱码和jvm大小调节

问题一:elasticsearch控制台中文乱码和jvm内存大小调整。 解决办法: 修改conf下面的jvm.options如下 -Xms256m -Xmx256m # ensure UTF-8 encoding by default (e.g. filenames) #-Dfile.encoding=UTF-8 -Dfile.encoding=GBK...

Diligent_ten的博客 3205

(二十五)JVM调优之调节executor堆外内存与连接等待时长

executor堆外内存 有时候,如果你的spark作业处理的数据量特别特别大,几亿数据量;然后spark作业一运行,时不时的报错,shuffle file cannot find,executor、task lost,out of memory(内存溢出); 可能是说executor的堆外内存不太够用,导致executor在运行的过程中,可能会内存溢出;然后可能导致后续的stage的task在运行的时候,可能要从一些executor中去拉取shuffle map output文件,但是executor可能

weixin_37850264的博客 281

Java虚拟机之JVM调节参数

-XX:+PrintGC 使用这个参数,虚拟机启动后,每次GC就会打印日志。 -XX:+UseSerialGC 使用串行垃圾回收器。 -XX:+PrintGCDetails 打印详细信息、包括各个区的情况。 -XX:PrintCoommandLineFlags 将隐式或者显示传给虚拟机的参数打出。 -Xms 设置java程序启动时,初始堆大小。 -Xmx 设置java程序能获得的最大堆大...

weixin_30883311的博客 161

Apusic应用服务器的性能调节_JVM优化

            Apusic应用服务器作为企业应用的运行平台,系统的性能非常重要。当应用对性能的要求比较苛刻时,就要考虑是否需要改变系统的缺省设置来提升服务器的性能。首先应该考虑系统的硬件环境(CPU主频高低、内存大小、硬盘转速及网络传输速率等)是否能满足应用的需求。对于复杂的大型分布式企业应用,硬件环境不应该仅仅满足Apusic应用服务器的最低要求配置,而应该提高硬件配置使应用运行的

JDMBA的专栏 4724

如何调节idea jvm的最大内存_jvm系列二:内存区域如何区分

1、前文回顾上一篇文章(我们的java程序如何跑起来)我们谈到类加载机制,主要从加载、验证、准备、解析、初始化这几个阶段来认识类的加载流程。了解每一步分别干了什么?尤其在准备阶段和初始化阶段如何分配内存空间,简单用下图回顾一下:2、jvm内存区域如何划分我们都知道,jvm启动后会将class文件加载到内存,那么内存是一大整块,还是有区域划分呢?答案自然是,jvm内存划分了五个区域:分别是方法区、程...

weixin_39947501的博客 115
上一篇: linux下利用nohup后台运行jar文件包程序
下一篇: 线上Java应用排查和诊断规范
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值