jvm_threads_live_threads 和 jvm_threads_states_threads 这两个指标之间存在一定的关系,但它们关注的维度不同

jvm_threads_live_threads 和 jvm_threads_states_threads 这两个指标之间存在一定的关系,但它们关注的维度不同。以下是它们的详细关系和区别:


1. jvm_threads_live_threads

  • 含义

    • 表示当前 JVM 中存活的线程总数(即当前活动的线程数)。

    • 包括所有状态的线程(如 RUNNABLEBLOCKEDWAITINGTIMED_WAITING 等)。

  • 关键数值

    • live:当前存活的线程总数。

    • daemon:当前存活的守护线程数。

    • peak:JVM 启动以来的最大线程数。

  • 用途

    • 用于监控线程的总数,帮助判断是否存在线程泄漏或线程数异常增长。


2. jvm_threads_states_threads

  • 含义

    • 表示当前 JVM 中处于不同状态的线程数。

    • 每个线程的状态会被分类(如 RUNNABLEBLOCKEDWAITINGTIMED_WAITING 等)。

  • 关键数值

    • new:新建状态的线程数。

    • runnable:可运行状态的线程数。

    • blocked:阻塞状态的线程数。

    • waiting:无限期等待状态的线程数。

    • timed-waiting:有限期等待状态的线程数。

  • 用途

    • 用于分析线程的状态分布,帮助定位性能问题(如线程阻塞、死锁等)。


3. 两者之间的关系

jvm_threads_live_threads 和 jvm_threads_states_threads 之间的关系可以通过以下公式表示:

复制

jvm_threads_live_threads{state="live"} =jvm_threads_states_threads{state="new"} +jvm_threads_states_threads{state="runnable"} +jvm_threads_states_threads{state="blocked"} +jvm_threads_states_threads{state="waiting"} +jvm_threads_states_threads{state="timed-waiting"}

换句话说,jvm_threads_live_threads 是 jvm_threads_states_threads 中所有状态线程数的总和。

1. 指标定义

1.1 jvm_threads_live_threads

  • 含义:表示当前 JVM 中存活的线程总数。

  • 包含的子指标

    • live:当前存活的线程总数(包括所有状态的线程)。

    • daemon:当前存活的守护线程数。

    • peak:JVM 启动以来的最大线程数。

1.2 jvm_threads_states_threads

  • 含义:表示当前 JVM 中处于不同状态的线程数。

  • 包含的子指标

    • new:新建状态的线程数。

    • runnable:可运行状态的线程数。

    • blocked:阻塞状态的线程数。

    • waiting:无限期等待状态的线程数。

    • timed_waiting:有限期等待状态的线程数。

    • terminated:已终止状态的线程数。


2. 指标之间的关系

2.1 jvm_threads_live_threads 中的 live

  • live 表示当前存活的线程总数,它与 jvm_threads_states_threads 的关系如下:

    复制

    jvm_threads_live_threads{state="live"} =jvm_threads_states_threads{state="new"} +jvm_threads_states_threads{state="runnable"} +jvm_threads_states_threads{state="blocked"} +jvm_threads_states_threads{state="waiting"} +jvm_threads_states_threads{state="timed_waiting"}
    • 注意:terminated 状态的线程不计入 live

2.2 jvm_threads_live_threads 中的 daemon 和 peak

  • daemon:表示当前存活的守护线程数。它与 jvm_threads_states_threads 没有直接关系,因为它只关注线程的类型(守护线程或非守护线程),而不关注线程的状态。

  • peak:表示 JVM 启动以来的最大线程数。它是一个历史值,与当前线程状态无关。


3. 总结

  • jvm_threads_live_threads{state="live"} 是 jvm_threads_states_threads 中所有状态线程数的总和(不包括 terminated 状态的线程)。

  • jvm_threads_live_threads 中的 daemon 和 peak 与 jvm_threads_states_threads 没有直接关系:

    • daemon 表示守护线程的数量。

    • peak 表示历史最大线程数。

守护线程(Daemon Thread) 是 Java 中的一种特殊线程,它的生命周期依赖于非守护线程(即用户线程)。以下是守护线程的详细解释:


1. 守护线程的定义

  • 守护线程 是为其他线程(用户线程)提供服务的线程。

  • 当所有的用户线程结束时,守护线程会自动退出,即使它还没有完成任务。

  • 守护线程通常用于执行后台任务,如垃圾回收、监控、日志记录等。


2. 守护线程的特点

2.1 生命周期

  • 守护线程的生命周期依赖于用户线程。

  • 当所有的用户线程结束时,JVM 会自动退出,同时所有的守护线程也会被强制终止。

2.2 优先级

  • 守护线程的优先级通常较低,因为它们是为用户线程服务的。

2.3 应用场景

  • 垃圾回收(GC)线程。

  • 监控线程(如性能监控、心跳检测)。

  • 日志记录线程。


3. 守护线程 vs 用户线程

特性守护线程用户线程
生命周期依赖于用户线程,用户线程结束时自动退出独立运行,不会因为其他线程结束而退出
优先级通常较低可以设置优先级
应用场景后台任务(如 GC、监控、日志)主程序逻辑
默认类型新创建的线程默认是用户线程需要显式设置为守护线程

4. 如何创建守护线程

在 Java 中,可以通过 setDaemon(true) 将一个线程设置为守护线程。

4.1 示例代码

java

复制

public class DaemonThreadExample {public static void main(String[] args) {Thread daemonThread = new Thread(() -> {while (true) {System.out.println("Daemon thread is running...");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});// 设置为守护线程daemonThread.setDaemon(true);// 启动线程daemonThread.start();// 主线程休眠 3 秒后结束try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Main thread finished.");}
}

4.2 运行结果

复制

Daemon thread is running...
Daemon thread is running...
Daemon thread is running...
Main thread finished.
  • 主线程结束后,守护线程也会自动退出。


5. 守护线程的注意事项

5.1 资源清理

  • 守护线程不应该执行关键任务(如文件写入、数据库操作),因为它可能会被强制终止,导致资源未正确释放。

5.2 线程优先级

  • 守护线程的优先级通常较低,如果需要高优先级任务,建议使用用户线程。

5.3 线程池中的守护线程

  • 在线程池中,默认创建的线程是用户线程。如果需要使用守护线程,可以通过自定义 ThreadFactory 实现。


6. 实际应用场景

6.1 垃圾回收(GC)

  • JVM 的垃圾回收线程是守护线程,当所有用户线程结束时,GC 线程也会自动退出。

6.2 监控任务

  • 例如,监控系统的 CPU 使用率、内存使用率等,可以使用守护线程定期采集数据。

6.3 日志记录

  • 将日志记录任务交给守护线程,避免影响主程序的性能。


7. 总结

  • 守护线程 是为用户线程提供服务的后台线程。

  • 当所有用户线程结束时,守护线程会自动退出。

  • 守护线程通常用于执行非关键任务(如 GC、监控、日志记录)。

  • 在 Java 中,可以通过 setDaemon(true) 将一个线程设置为守护线程。

如果有其他问题,请随时告诉我!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/5049.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序获取微信运动步数

1、用户点击按钮&#xff0c;在小程序中触发getuserinfo方法&#xff0c;获取用户信息 <scroll-view class"scrollarea" scroll-y type"list"><view class"container"><button bind:tap"getLogin">获取</button&…

macOS 安装JDK17

文章目录 前言介绍新特性下载安装1.下载完成后打开downloads 双击进行安装2.配置环境变量3.测试快速切换JDK 小结 前言 近期找开源软件&#xff0c;发现很多都已经使用JDK17springboot3 了&#xff0c;之前的JDK8已经被替换下场&#xff0c;所以今天就在本机安装了JDK17&#…

Windows电脑桌面记录日程安排的提醒软件

在快节奏的现代生活中&#xff0c;工作效率成为了衡量个人能力的重要标准之一。然而&#xff0c;日常办公中常常会遇到各种琐事和任务&#xff0c;如果没有合理安排日程&#xff0c;很容易陷入混乱&#xff0c;导致效率低下。因此&#xff0c;做好日程安排对于日常工作至关重要…

MFC 使用 32位带Alpha通道的位图

最近需要做一个MFC界面上的图片,众所周知,MFC 好像只支持 bmp 格式的! 先看我的原始24位图片,RGB 三个颜色各占8位 (256色), 所以是24位。 如果放到MFC界面上,是这个很丑的效果 它是一个正方形图片,周围的白色可以看见。 解下来,进入今天的主题: 32位带 Alpha 通…

Ubuntu22部署MySQL5.7详细教程

Ubuntu22部署MySQL5.7详细教程 一、下载MySQL安装包二、安装MySQL三、启动MySQL 检查状态登录MySQL 四、开启远程访问功能 1、允许其他主机通过root访问数据库2、修改配置文件&#xff0c;允许其他IP通过自定义端口访问 五、使用Navicat连接数据库 默认情况下&#xff0c;Ubun…

大模型 | AI驱动的数据分析:利用自然语言实现数据查询到可视化呈现

【本文作者&#xff1a;擎创科技资深产品专家 布博士】 在当今AI驱动的时代&#xff0c;数据分析已成为各行各业不可或缺的能力。然而&#xff0c;传统的数据分析流程通常需要掌握SQL、数据处理和可视化等多项专业技能&#xff0c;这对非技术背景的业务人员来说是一个不小的挑…

C++ ——— 模拟实现 vector 类

目录 vector 类的框架 无参数的构造函数 析构函数 获取有效数据个数 获取容量 重载 [] 运算符 可读可写版本 只可读版本 扩容 尾插 实现迭代器 可读可写版本 只可读版本 自定义设置size长度和内容 在任意位置插入 删除任意位置的数据 赋值重载 vector 类的框…

Git处理冲突详解

文章目录 Git处理冲突详解一、引言二、冲突产生的原因三、解决冲突的步骤1. 手动解决冲突1.1 查看冲突文件1.2 编辑冲突文件1.3 提交解决冲突 2. 使用合并工具解决冲突 四、使用示例五、总结 Git处理冲突详解 一、引言 在团队协作开发中&#xff0c;Git冲突是不可避免的。当多…

GS论文阅读--GeoTexDensifier

前言 本文是一个关于高斯致密化策略对高斯地图进行优化&#xff0c;他主要关注了几何结构和纹理信息。我最近对于高斯点的分布比较感兴趣&#xff0c;因为高斯点的分布决定了之后重建质量的好坏&#xff0c;初始化高斯很重要&#xff0c;但之后的维护需要致密化与修建策略&…

【云原生布道系列】第三篇:“软”饭“硬”吃的计算

1 虚拟化技术定义 首先援引一段《虚拟化技术发展编年史》中针对虚拟化技术的定义&#xff1a;在计算机科学中&#xff0c;虚拟化技术&#xff08;Virtualization&#xff09;是一种资源管理&#xff08;优化&#xff09;技术&#xff0c;将计算机的各种物理资源&#xff08;例如…

Java虚拟机面试题:内存管理(中)

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

Linux容器(初学了解)

目录 一、容器 1.1、容器技术 1.2、容器和虚拟机之间的差异 1.3、Rootless 和 Rootful 容器 1.4、设计基于容器的架构 1.5、容器管理工具 1.6、容器镜像和注册表 1.7、配置容器注册表 1.8、使用容器文件构建容器镜像 二、部署容器 2.1、Podman 实用程序 2.2、安装容…

代码随想录_字符串

字符串 344.反转字符串 344. 反转字符串 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须**原地修改输入数组**、使用 O(1) 的额外空间解决这一问题。 思路: 双指针 代…

Visual Studio Community 2022(VS2022)安装方法

废话不多说直接上图&#xff1a; 直接上步骤&#xff1a; 1&#xff0c;首先可以下载安装一个Visual Studio安装器&#xff0c;叫做Visual Studio installer。这个安装文件很小&#xff0c;很快就安装完成了。 2&#xff0c;打开Visual Studio installer 小软件 3&#xff0c…

PostgreSQL的学习心得和知识总结(一百六十六)|深入理解PostgreSQL数据库之\watch元命令的实现原理

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

在k8s中部署一个可外部访问的Redis Sentinel

1.前提条件&#xff1a; 1.部署了multus 想要k8s外部能访问k8s内部的redis&#xff0c;redis-server启动时必须使用multus的IP 2.helm客户端安装 2.开始安装 准备3个multus ip 10.10.10.130 10.10.10.131 10.10.10.132 apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttac…

目标跟踪算法发展简史

单目标跟踪&#xff08;Single Object Tracking&#xff0c;SOT&#xff09;是计算机视觉领域中的一个重要研究方向&#xff0c;旨在在视频序列中持续定位并跟踪一个特定目标。随着计算机视觉和机器学习技术的飞速发展&#xff0c;单目标跟踪算法经历了从经典方法到深度学习的演…

使用LPT wiggler jtag自制三星单片机(sam88 core)编程器-S3F9454

写在前面 新年好&#xff0c;各位&#xff0c;今天来分享制作一个三星单片机的编程器 嘿嘿&#xff0c;x鱼垃圾佬元件库有些三星单片机s3f9454&#xff0c;编程器不想买&#xff0c;基本拿来拆件玩的。但&#xff0c;前些时候csdn下载到它的编程时序&#xff0c;自己来做个编程…

Spring 中的事件驱动模型

事件驱动的基本了解 事件模式也就是观察者模式&#xff0c;当一个对象改变的时候&#xff0c;所有依赖的对象都会收到一个通知。 Subject&#xff1a;抽象主题 Observer&#xff1a;具体主题 Concrete Subject&#xff1a;抽象观察者&#xff0c;在得到更新通知之后去更新自…

玉米植物结构受乙烯生物合成基因 ZmACS7 的调控

摘要&#xff1a; 植物高度和叶片角度是玉米&#xff08;Zea mays&#xff09;植物结构的两个关键决定因素&#xff0c;与高种植密度下的抗倒伏性和冠层光合作用密切相关。这两个性状主要由几种植物激素调节。然而&#xff0c;乙烯在调节玉米植物结构中的机制&#xff0c;特别…