2011-08-17 79 views
5

我想獲得一個線程的進程ID,看看它需要多少內存。Java線程是否有自己的進程ID?

+0

好的,謝謝(你可能想發佈這個答案,所以我可以接受它) –

+0

我相信,是的。 (。我的想法是通過進程ID來檢查單個線程的內存使用 –

+1

在這種情況下,你需要運行的線程執行在一個單獨的進程是什麼一般來說,這是更多的麻煩比它的價值不是它。可以更容易地使用你的判斷與探查器運行應用程序和關聯與線程的最大結構。 –

回答

10

這取決於操作系統以及它如何管理線程。理論上它也取決於JVM如何實現線程,但所有現代JVM都將它們實現爲本地線程。

在Linux上每個線程 用來獲得自己的進程ID,但是大多數工具隱藏所有,但每個進程一個線程(即你通常不會看到它們,除非你明確要求對他們來說,ps使用-m標誌例如)。這是由於Linux內核在線程和任務之間並沒有太大區別。

編輯:因爲我剛剛得知這不再一定的情況:你可以創建具有完全相同的PID爲母體,在這種情況下,線程將通過不同的線程ID來區分一個線程。

然而因爲線程共享內存在同一進程中的所有其他線程,這幫你找出「多少內存線程需要」,因爲流程中的所有線程將使用完全相同的數量(他們都使用相同的,所以實際使用的內存是shown_memory_use而不是shown_memory_user * number_of_threads)。

+0

如果「線程共享內存與所有其他線程在同一進程」怎麼可以有一個不同的進程ID?線程ID,是。 – EJP

+2

這就是Linux的工作方式。一個單獨的進程ID並不意味着內存是分開的,即使是一個常規進程在分支之後直接與父進程共享內存(儘管可以通過寫入進行復制)。您可以創建共享相同PID的線程(克隆(2)與CLONE_THREAD),但較早的方式是爲每個線程分配一個自己的PID。不確定今天的JVM使用什麼樣的克隆。 –

+0

謝謝你的回答!這正是我的意思:) –

3

顧名思義,PID意味着進程ID。每個進程都可以產生多個線程,這些線程都共享相同的PID。你確定你不是指Thread ID嗎?

4

線程沒有PID,進程可以。因此你所要求的是不可能的。也沒有可靠的方法從Java進程中檢索您的PID(雖然ManagementFactory.getRuntimeMXBean().getName()返回的值的第一部分通常是PID)。

1

線程的一個特性就是與所有其他線程共享堆。這意味着任何一個線程都可能使用幾乎所有的進程內存。線程無法訪問的唯一東西是另一個線程的堆棧或局部變量。

因此,嘗試確定單個線程使用多少內存是沒有用的。相反,確定數據結構使用多少內存會很有用。 (雖然這可能有類似的困難)

值得注意的是主內存價格相對便宜。您的情況可能會有所不同,但一臺典型的24 GB新服務器的成本可能低至1K英鎊。您可以購買大約2千英鎊的96 GB電腦。有時在你知道這是一個問題之前,不用擔心你使用了多少內存。

相關問題