2012-09-25 152 views
2

我正在運行一個實驗性的java應用程序,每當我殺死或停止應用程序時,殭屍進程都會被創建。我知道殭屍並不是真正的問題,因爲它們(據說)不會消耗資源。但是,我的RAM可用空間明顯小於應該的數量。這裏是殺死java殭屍進程

ps aux | grep java 

3052 8.5 0.0  0  0 ?  Zl Sep24 127:24 [java] <defunct> 
6644 0.9 0.0  0  0 ?  Zl Sep24 13:20 [java] <defunct> 
8325 0.7 0.0  0  0 ?  Zl Sep24 11:01 [java] <defunct> 
8954 0.7 0.0  0  0 ?  Zl Sep24 11:01 [java] <defunct> 
16229 1.3 0.0  0  0 ?  Zl Sep24 16:57 [java] <defunct> 
19222 106 0.0  0  0 ?  Zl Sep24 1346:37 [java] <defunct> 

無以下工作:(

kill -9 PID , kill -1 PID, kill -KILL PID 

我不能重新啓動我的機器的轉儲!所以我會非常歡迎任何解決方案。

+1

如果您的機器不會重新啓動,並且進程表如此之大以至於佔用了RAM的很大一部分,現在是時候拔掉電源插頭或致電驅魔人了。 – geoffspear

+0

你有幾個基本的誤解,但最重要的是:你應該擁有的可用RAM的數量儘可能接近零。免費的RAM是純粹的損失。這不像是你今天使用一半內存,你明天可以使用額外的內存。如果您想讓RAM免費,請將其從機器中取出並放在您的桌面上。當我們想讓系統更好地運行時,我們通常通過增加RAM來獲得更多的RAM。 –

+0

嗯,謝謝大衛,但我知道我在說什麼。 – DotNet

回答

8

的等待(2)人頁面告訴你:

終止但未被等待的孩子成爲「殭屍」。內核維護一個最小的信息集n關於殭屍進程(PID,終止狀態,資源使用信息),以便父母稍後執行等待以獲取關於該孩子的信息。只要殭屍不會通過等待從系統中移除,它將佔用內核進程表中的一個插槽,並且如果填充該表,則將不可能創建進一步的進程。如果一個父進程終止,那麼它的「殭屍」子(如果有的話)被init(8)採用,它會自動執行一個等待來移除殭屍。

所以你必須尋找父母你的殭屍進程ID並殺死這些。然後init將埋葬你的殭屍。對於此ps -fpstree將幫助你。

+0

謝謝。父級是init。 – DotNet

+2

如果你的殭屍的__direct__父母是init,那麼你有一個_real_問題,因爲這意味着你的init不再做它的工作。這反過來又是重新啓動並深入查看發行版的錯誤數據庫的一個很好的理由。 –

+0

謝謝A.H.我同意你和我剛剛重新啓動機器。 – DotNet