【问题标题】:Java program not existing cleanly. Creates ZombiesJava 程序不干净地存在。创建僵尸
【发布时间】:2012-12-01 13:33:52
【问题描述】:

场景

我有一个 java 应用程序(使用 Spring Integration 侦听 TCP/IP 端口)。 我正在使用一些工作线程和用 java.util.concurrent.Executors 工厂创建的 ExecuterService。 主线程创建工作线程并在如下循环中等待

while(!shutdownRequested)
{
    try {
         Thread.sleep(2000);
         } catch (InterruptedException e) {
           e.printStackTrace();
         }
}

我有一个关闭钩子,它会停止执行器服务并在超时时强制关闭。

问题
该程序在我的机器(Windows 7)上没有成功终止。它留下一个线程在 tcp 端口上侦听,之后该进程变得无法访问。 我无法从任务管理器中终止此进程并收到“拒绝访问”错误。

有趣的是,这个问题只发生在我的机器上,不会影响任何其他 Windows 7 机器。在所有其他机器上,控制台中的 Control-C 总是成功地停止程序。

我过去曾遇到过这个问题(使用相同的应用程序),在我重新格式化并重新安装 Windows 后,这个问题神奇地消失了。 (我知道这有点过分了!!)

该应用程序运行了好几个月,直到不幸的是我最近因为其他原因不得不再次重新格式化我的电脑。重新格式化后问题又出现了。

这非常令人沮丧,因为每次我需要重新启动此应用程序时,我都必须重新启动 Windows,因为它无法绑定到 TCP 端口,因为僵尸进程在该端口上 litening。

任何想法我的设置可能有什么问题?

【问题讨论】:

  • 我会确保您拥有 Windows 的最新更新,因为这似乎是一个操作系统错误。
  • 感谢 Peter 的建议,但 Windows 安装与我公司使用的标准映像相同,其他人没有遇到此问题!我也尝试将我的 java 更新到最新版本。

标签: java windows-7 spring-integration tcp-ip


【解决方案1】:

您可能需要close() 套接字。 这将导致套接字抛出 SocketException,从而停止阻塞。

【讨论】:

  • 谢谢,但正如我提到的,我正在使用 Spring Integration(具体为 TcpInboundGateway)进行通信,并且不直接控制 Socket。但是,我尝试调用 ctx.stop() 和 ctx.close() 甚至 System.exit(0) 都无济于事!!。此处的 ctx 表示 Spring 应用程序上下文。
  • 我想说你需要 stop() TcpInboundGateway 来强制它关闭套接字。但是,停止上下文已经完成了。如果 System.exit(0) 不起作用,那么听起来它超出了您在 Java 中可以做的任何事情,这是一个 OS/JVM 问题。您可以进行线程转储以查看错误线程在做什么。您可以使用 jstack 或 VisualVM 来获取线程转储。顺便说一句,至少在 XP 上,您可以使用 drwtsn32 -p [pid] 终止进程 - 您可以通过在 TaskManager 上启用该列来找到 pid。
猜你喜欢
  • 2014-09-30
  • 2016-12-13
  • 1970-01-01
  • 1970-01-01
  • 2013-11-18
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
  • 2021-12-09
相关资源
最近更新 更多