JMX 显示的线程比 OS 少得多

JMX showing much less threads than OS

我有一个多线程 Java 服务器,我在其中监视它使用的线程数。最近,我注意到 OS 报告的应用程序线程比 JMX 多得多。例如:

cat /sys/fs/cgroup/pids/system.slice/NAME.service/pids.current 294 ps -eLf | grep java | grep NAME | wc 294 curl -s localhost:9102 | grep jvm_threads_current 223.0

其中端口 9102 托管 Prometheus JMX 代理。所以我们看到区别是 71 个线程——与 JMX 相比,OS 看到 71 个额外的线程。虽然我可以假设 Java 可能 运行 某些工作线程未在 JVM/JMX 统计信息中报告,但 70 多个线程听起来很多。这里有什么问题吗?这两个衡量的是不同的东西吗?可能有普罗米修斯错误吗?或者这些线程是正常的,如果是这样 - 它们到底在做什么?

JVM 版本是 1.8.0_162-8u162-b12-1~deb9u1-b12 运行ning Linux。

Recently, I have noticed that OS reports many more threads for the app than JMX

在写一个简单的主程序时,我也是这么看的。 JMX 说我有 12 个线程(主线程、GC、终结器、JMX 等),而 ps -eLf 说我有 29 个。我从来没有注意到这种差异,可能是因为我通常使用 ps -a -e 样式命令。

Is there something wrong here? Are those two measuring different things? Is there a Prometheus bug maybe? Or these threads are normal and if so - what exactly they are doing?

我认为您在幕后窥视 OS 如何管理 Java 线程,不必担心。 OS 与 Java 线程使用的进程数将在很大程度上取决于您的 Java 版本和 OS 本机线程实现。我认为它们 "doing" 什么都不是,但很可能出于某些 OS 会计原因而存在,您无需担心。