我正在运行一个实验性的java应用程序,每次我杀死或停止应用程序时,都会创建僵尸进程。我知道僵尸并不是真正的问题,因为他们(据说)不会消耗资源。但是,我的RAM可用空间明显少于应有的空间。这是
的转储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
我无法重启我的机器!所以我非常欢迎任何解决方案。
答案 0 :(得分:8)
wait(2)手册页告诉你:
终止但尚未等待的孩子成为“僵尸”。内核维护有关僵尸进程(PID,终止状态,资源使用信息)的最小信息集,以便允许父进程稍后执行等待以获得关于子进程的信息。只要没有通过等待从系统中删除僵尸,它就会占用内核进程表中的一个插槽,如果该表填充,则无法创建进一步的进程。如果父进程终止,则它的“僵尸”子进程(如果有的话)被init(8)采用,它会自动执行等待删除僵尸。
因此,您必须查找僵尸的父进程ID并将其杀死。然后init
将埋葬你的僵尸。对于此ps -f
或pstree
会对您有帮助。