2011-08-17 13 views
5

Chcę uzyskać identyfikator procesu wątku, aby zobaczyć, ile pamięci zajmuje.Czy wątek Java ma własny identyfikator procesu?

+0

Okay, dziękuję (: Możesz napisać to jako odpowiedź, więc mogę to zaakceptować;) –

+0

Jestem pewien, tak. (Mój pomysł polegał na sprawdzeniu użycia pamięci RAM pojedynczego wątku za pomocą identyfikatora procesu: –

+1

W takim przypadku musisz uruchomić wątek w oddzielnym procesie, co generalnie oznacza więcej problemów niż jest wart. łatwiej jest uruchomić aplikację za pomocą narzędzia profilowania i powiązać największe struktury z wątkiem, korzystając z Twojej oceny –

Odpowiedz

10

To zależy bardzo od systemu operacyjnego i sposobu zarządzania wątkami. Teoretycznie zależy to również od tego, w jaki sposób JVM implementuje wątki, ale wszystkie nowoczesne JVM implementują je jako natywne wątki.

Na Linuksie każdy wątek będą stosować, aby uzyskać swój własny identyfikator procesu, ale większość narzędzi ukryć wszystkie oprócz jednego wątku na procesie (czyli zwykle nie ich zobaczyć, chyba że wyraźnie poprosić, ps używa flagi -m na przykład). Jest to spowodowane faktem, że jądro Linuksa nie ma większego wpływu na wątki i zadania.

Edit: jak tylko dowiedział się o tym nie jest już koniecznie sprawa: wy może utworzyć wątku z dokładnie tym samym PID jako rodzica, w którym to przypadku nici zostaną rozróżnione przez różnych identyfikatorów wątku .

Jednak od nitki dzieli pamięć o wszystkich innych wątków w tym samym procesie, to nie pomóc dowiedzieć się, „ile pamięci zajmuje nić”, ponieważ wszystkie wątki w procesie użyje dokładnie taką samą ilość (i wszystkie używają tego samego, więc prawdziwa używana pamięć to shown_memory_use, a nie shown_memory_user * number_of_threads).

+0

Jeśli "wątek dzieli się swoją pamięcią ze wszystkimi innymi wątkami w tym samym procesie", jak może mieć oddzielny identyfikator procesu? tak. – EJP

+2

Tak właśnie działa Linux. Oddzielny identyfikator procesu nie oznacza, że ​​pamięć jest oddzielona, ​​nawet zwykły proces dzieli się pamięcią z elementem nadrzędnym bezpośrednio po rozwidleniu (choćby przy kopiowaniu na piśmie). Możesz tworzyć wątki, które dzielą ten sam PID (klon (2) z CLONE_THREAD), ale starszym sposobem jest nadanie każdemu wątkowi własnego PID. Nie wiem jednak, jakiego rodzaju klonem dziś używają JVM. –

+0

Dziękuję za odpowiedź! Właśnie o to mi chodziło :) –

3

Jak sama nazwa wskazuje, PID oznacza identyfikator procesu. Każdy proces może spawnować wiele wątków, z których wszystkie mają ten sam PID. Czy na pewno nie masz na myśli identyfikatora wątku?

4

Wątki nie mają PID-ów, procesy to robią. W związku z tym to, o co prosisz, nie jest możliwe. Nie ma również niezawodnego sposobu na odzyskanie PID z procesu Java (chociaż pierwszą częścią wartości zwróconej przez ManagementFactory.getRuntimeMXBean().getName() jest zwykle PID).

1

Cechą wątku jest dzielenie sterty wszystkimi pozostałymi wątkami. Oznacza to, że każdy wątek może potencjalnie wykorzystać prawie całą pamięć procesu. Jedyną rzeczą, do której wątek nie ma dostępu, jest stos lub lokalne zmienne innego wątku.

Jako takie nie jest przydatne, aby spróbować określić, ile pamięci używa dany wątek. Zamiast tego może być przydatne określenie, ile pamięci wykorzystuje struktura danych. (Chociaż może to mieć podobne trudności)

Warto zauważyć, że pamięć główna jest stosunkowo tania. Twoja sytuacja może być inna, ale typowy nowy serwer z 24 GB może kosztować zaledwie 1K. Możesz kupić komputer o pojemności 96 GB za około 2 000 funtów. Czasami nie warto martwić się o ile pamięci używasz, dopóki nie wiesz, że to jest problem.

Powiązane problemy