【问题标题】:Killing a java zombie process杀死一个java僵尸进程
【发布时间】:2012-09-25 17:26:32
【问题描述】:

我正在运行一个实验性的 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 

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

【问题讨论】:

  • 如果您的机器无法重新启动并且进程表太大以至于占用了很大一部分 RAM,那么是时候拔掉电源插头或呼叫驱魔人了。
  • 您有几个基本的误解,但最重要的是:您应该拥有的可用 RAM 量尽可能接近于零。空闲内存是纯粹的损失。这不像今天使用一半的 RAM,明天就可以使用额外的 RAM。如果您希望 RAM 空闲,请将其从您的机器中取出并放在您的办公桌上。当我们想让系统性能更好时,我们通常通过增加 RAM 来让它使用更多的 RAM。
  • 好吧,谢谢大卫,但我知道我在说什么。
  • @DotNet:如果你这样做了,你就不会说“我的 RAM 可用空间明显少于应有的空间”。可用 RAM 应尽可能接近零,以使操作系统能够摆脱。

标签: linux kill-process zombie-process


【解决方案1】:

wait(2) 手册页告诉你:

终止但没有被等待的孩子变成了“僵尸”。内核维护有关僵尸进程的最小信息集(PID、终止状态、资源使用信息),以便允许父进程稍后执行等待以获取有关子进程的信息。只要僵尸没有通过等待从系统中移除,它就会消耗内核进程表中的一个槽,如果这个表被填满,就不能再创建更多的进程。如果父进程终止,那么它的“僵尸”子进程(如果有)会被 init(8) 采用,它会自动执行等待以移除僵尸进程。

所以你必须寻找你的僵尸的进程ID并杀死它们。然后init 会埋葬你的僵尸。为此ps -fpstree 将为您提供帮助。

【讨论】:

  • 如果你的僵尸的 direct 父级是 init,那么你有一个真正的问题,因为这意味着你的 init 不再做它的工作.这反过来又是重新启动和深入了解您的发行版的错误数据库的一个很好的理由。
  • 谢谢啊。我同意你的观点,我刚刚重启了机器。
猜你喜欢
  • 2013-06-01
  • 2011-09-14
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
相关资源
最近更新 更多