杀死一个java僵尸进程

Dot*_*Net 2 linux zombie-process kill-process

我正在运行一个实验性的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>
Run Code Online (Sandbox Code Playgroud)

以下都不起作用:(

kill -9 PID , kill -1 PID, kill -KILL PID 
Run Code Online (Sandbox Code Playgroud)

我无法重启我的机器!所以我非常欢迎任何解决方案.

A.H*_*.H. 8

wait(2)手册页告诉您:

终止但尚未等待的孩子变成了"僵尸".内核维护有关僵尸进程(PID,终止状态,资源使用信息)的最小信息集,以便允许父进程稍后执行等待以获得关于子进程的信息.只要没有通过等待从系统中删除僵尸,它就会占用内核进程表中的一个插槽,如果该表填充,则无法创建进一步的进程.如果父进程终止,那么它的"僵尸"子进程(如果有的话)被init(8)采用,它会自动执行等待删除僵尸.

因此,您必须查找僵尸的进程ID并杀死它们.然后init会埋葬你的僵尸.为此ps -fpstree将帮助您.

  • 如果你的僵尸的__direct__父亲是init,那么你有一个_real_问题,因为这意味着你的init不再做它的工作了.反过来,这是重新启动和深入了解您的发行版的错误数据库的一个非常好的理由. (2认同)