我想獲得一個線程的進程ID,看看它需要多少內存。Java線程是否有自己的進程ID?
回答
這取決於操作系統以及它如何管理線程。理論上它也取決於JVM如何實現線程,但所有現代JVM都將它們實現爲本地線程。
在Linux上每個線程
將
用來獲得自己的進程ID,但是大多數工具隱藏所有,但每個進程一個線程(即你通常不會看到它們,除非你明確要求對他們來說,ps
使用-m
標誌例如)。這是由於Linux內核在線程和任務之間並沒有太大區別。
編輯:因爲我剛剛得知這不再一定的情況:你可以創建具有完全相同的PID爲母體,在這種情況下,線程將通過不同的線程ID來區分一個線程。
然而因爲線程共享內存在同一進程中的所有其他線程,這不幫你找出「多少內存線程需要」,因爲流程中的所有線程將使用完全相同的數量(他們都使用相同的,所以實際使用的內存是shown_memory_use
而不是shown_memory_user * number_of_threads
)。
如果「線程共享內存與所有其他線程在同一進程」怎麼可以有一個不同的進程ID?線程ID,是。 – EJP
這就是Linux的工作方式。一個單獨的進程ID並不意味着內存是分開的,即使是一個常規進程在分支之後直接與父進程共享內存(儘管可以通過寫入進行復制)。您可以創建共享相同PID的線程(克隆(2)與CLONE_THREAD),但較早的方式是爲每個線程分配一個自己的PID。不確定今天的JVM使用什麼樣的克隆。 –
謝謝你的回答!這正是我的意思:) –
顧名思義,PID意味着進程ID。每個進程都可以產生多個線程,這些線程都共享相同的PID。你確定你不是指Thread ID嗎?
線程沒有PID,進程可以。因此你所要求的是不可能的。也沒有可靠的方法從Java進程中檢索您的PID(雖然ManagementFactory.getRuntimeMXBean().getName()
返回的值的第一部分通常是PID)。
線程的一個特性就是與所有其他線程共享堆。這意味着任何一個線程都可能使用幾乎所有的進程內存。線程無法訪問的唯一東西是另一個線程的堆棧或局部變量。
因此,嘗試確定單個線程使用多少內存是沒有用的。相反,確定數據結構使用多少內存會很有用。 (雖然這可能有類似的困難)
值得注意的是主內存價格相對便宜。您的情況可能會有所不同,但一臺典型的24 GB新服務器的成本可能低至1K英鎊。您可以購買大約2千英鎊的96 GB電腦。有時在你知道這是一個問題之前,不用擔心你使用了多少內存。
- 1. 進程是否有自己的內存?
- 2. 是否有可能使用操作系統線程創建自己的線程?
- 3. 每個託管線程是否都有自己對應的本地線程?
- 4. 線程可以調用SuspendThread傳遞自己的線程ID嗎?
- 5. 線程是否在用戶進程中獲得自己的時間片?
- 6. 是否有可能獲得自己的進程名稱?
- 7. 是否有可能將線程自己睡眠?
- 8. Linux進程調度程序 - 它們自己是否使用CPU?
- 9. 查找我自己.NET進程的所有子進程/查明給定進程是否屬於我自己的子進程?
- 10. 是否有可能爲有管理的線程有自己的競爭條件
- 11. Posix線程ID與linux線程ID是否有一對一的關係?
- 12. 具有A類在自己的線程
- 13. Java的線程是否像Linux上的進程一樣工作?
- 14. 具有多線程的Java單進程
- 15. dotnet崩潰服務是否終止它自己的線程?
- 16. AppDomain是否在自己的線程中執行?
- 17. SerialPort是否在自己的線程上接收數據?
- 18. 子過程在自己的線程
- 19. 在其自己的線程或進程中運行`mainloop()`?
- 20. 進程線程是否安全?
- 21. 有自己的ID
- 22. 子進程是否總是在父進程內運行?是否...線程...?
- 23. 我是否需要使用線程類捕獲自己?
- 24. 如何產生一個腳本的n個線程,每個腳本都有自己的進程ID?
- 25. 守護進程線程是否也是守護進程線程啓動的線程?
- 26. 石英調度程序是否在自己的線程上運行?
- 27. 是否有多線程的Web編程?
- 28. 如何在Java中的線程之間傳遞進程ID?
- 29. java守護進程線程
- 30. 單線程進程是否只包含一個線程?
好的,謝謝(你可能想發佈這個答案,所以我可以接受它) –
我相信,是的。 (。我的想法是通過進程ID來檢查單個線程的內存使用 –
在這種情況下,你需要運行的線程執行在一個單獨的進程是什麼一般來說,這是更多的麻煩比它的價值不是它。可以更容易地使用你的判斷與探查器運行應用程序和關聯與線程的最大結構。 –