我有一个多线程Java服务器,我正在监视它使用的线程数。最近,我注意到操作系统报告了比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个线程 - 操作系统看到71个额外的线程与JMX相比。虽然我可以假设Java可能会运行一些未在JVM / JMX统计数据中报告的工作线程,但70多个线程听起来很多。这里有什么问题吗?这两个是不同的东西吗?是否有普罗米修斯的错误?或者这些线程是正常的,如果是这样 - 他们究竟在做什么?
在Linux上运行JVM版本1.8.0_162-8u162-b12-1~deb9u1-b12
。
答案 0 :(得分:2)
最近,我注意到操作系统报告了比JMX更多的应用程序线程
在编写一个简单的主程序时,我看到了相同的内容。 JMX说我有12个线程(主,GC,终结器,JMX,......),而ps -eLf
说我有29个。我从来没有注意到这种差异可能是因为我通常使用ps -a
代替-e
样式命令。
这里有什么不对吗?这两个是不同的东西吗?是否有普罗米修斯的错误?或者这些线程是正常的,如果是这样 - 他们到底在做什么?
我认为你在操作系统如何管理Java线程并且不应该担心的面纱背后隐藏着。操作系统与Java线程使用的进程数量将在很大程度上取决于您的Java版本和操作系统本机线程实现。我不认为他们“正在”做任何事情,但最有可能出现一些操作系统会计原因,你不需要关心自己。