У меня есть многопоточный сервер 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 находится агент Прометей JMX. Итак, мы видим, что разница составляет 71 поток - ОС видит 71 дополнительный поток по сравнению с JMX. Хотя я могу предположить, что Java может запускать некоторые рабочие потоки, не указанные в статистике JVM / JMX, более 70 потоков звучат как много. Здесь что-то не так? Эти двое измеряют разные вещи? Может быть, это ошибка Прометея? Или эти потоки нормальные, и если да - что именно они делают?
Версия JVM - 1.8.0_162-8u162-b12-1~deb9u1-b12, работающая в 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?
Я думаю, вы заглядываете за завесу того, как ОС управляет потоками Java, и вам не о чем беспокоиться. Количество процессов, используемых ОС по сравнению с потоками Java, будет сильно зависеть от вашей версии Java и реализаций собственных потоков ОС. Я не думаю, что они что-то «делают», но, скорее всего, они здесь по какой-то причине учета ОС, о которой вам не нужно беспокоиться.