Есть ли у Java Thread свой собственный идентификатор процесса? - PullRequest
6 голосов
/ 17 августа 2011

Я хочу получить идентификатор процесса потока, чтобы увидеть, сколько памяти требуется.

Ответы [ 4 ]

11 голосов
/ 17 августа 2011

Это во многом зависит от ОС и от того, как она управляет потоками.Теоретически это также зависит от того, как JVM реализует потоки, но все современные JVM реализуют их как собственные потоки.

В Linux каждый поток будет использоваться для получения собственного идентификатора процесса, но большинство инструментов скрываютвсе, кроме одного потока на процесс (т. е. вы обычно не видите их, если вы явно не просите их, например, ps использует флаг -m).Это вызвано тем фактом, что ядро ​​Linux не имеет большого значения для потоков и задач.

Редактировать: , как я только что узнал, это больше не обязательно случай: вы можете создать поток с точно таким же PID, что и у родителя, и в этом случае потоки будут различаться по различным идентификаторам потоков.

Однако , так как поток делит свою память со всеми другими потоками в том же процессе, этот не не помогает вам выяснить, «сколько памяти занимает поток», поскольку все потоки в процессе будут использовать точноодинаковое количество (и все они используют одно и то же, поэтому реально используемая память составляет shown_memory_use, а не shown_memory_user * number_of_threads).

4 голосов
/ 17 августа 2011

Потоки не имеют PID, процессы имеют. Таким образом, то, что вы спрашиваете, невозможно. Также нет надежного способа получения вашего PID из процесса Java (хотя первая часть значения, возвращаемого ManagementFactory.getRuntimeMXBean().getName(), обычно является PID).

3 голосов
/ 17 августа 2011

Как видно из названия, PID означает идентификатор процесса.Каждый процесс может порождать несколько потоков, которые имеют один и тот же PID.Вы уверены, что не имеете в виду ID темы?

1 голос
/ 17 августа 2011

Особенностью потока является то, что он разделяет кучу со всеми другими потоками. Это означает, что любой поток потенциально может использовать почти всю память процесса. Единственное, к чему у потока нет доступа - это стек или локальные переменные другого потока.

Как таковое, бесполезно пытаться определить, сколько памяти использует отдельный поток. Вместо этого может быть полезно определить, сколько памяти использует структура данных. (Хотя это может иметь аналогичные трудности)

Стоит отметить, что основная память относительно дешевая. Ваша ситуация может отличаться, но типичный новый сервер с 24 ГБ может стоить всего £ 1K. Вы можете купить ПК на 96 ГБ примерно за 2 тыс. Фунтов. Иногда не стоит беспокоиться о том, сколько памяти вы используете, пока не узнаете, что это проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...