jvm_threads_live_threads 和 jvm_threads_states_threads 这两个指标之间存在肯定的关系,但它们关注的维度不同。以下是它们的详细关系和区别:
1. jvm_threads_live_threads
- 含义:
- 体现当前 JVM 中存活的线程总数(即当前活动的线程数)。
- 包罗全部状态的线程(如 RUNNABLE、BLOCKED、WAITING、TIMED_WAITING 等)。
- 关键数值:
- live:当前存活的线程总数。
- daemon:当前存活的保卫线程数。
- peak:JVM 启动以来的最大线程数。
- 用途:
- 用于监控线程的总数,帮助判断是否存在线程走漏或线程数异常增长。
2. jvm_threads_states_threads
- 含义:
- 体现当前 JVM 中处于不同状态的线程数。
- 每个线程的状态会被分类(如 RUNNABLE、BLOCKED、WAITING、TIMED_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) 将一个线程设置为保卫线程。
如果有其他问题,请随时告诉我!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |