地址已在使用:JVM_Bind,但使用netstat命令没有列出任何进程使用该端口

3
我有一个使用ServerSocket API (Java 8)并绑定在本地端口12000的Java进程。该进程在Windows服务Wrapper (exe4j)下运行。我有一个定时任务,在每天早上4点停止服务,几秒钟后重新启动。该进程已安装在超过400个客户位置。
一切都进行得很顺利,直到上周五。一些进程在早上4点无法正确重新启动。在两台服务器上,我可以连接和验证,重新启动失败,并显示“Address already in use: JVM_Bind”。似乎端口12000仍由系统占用。
我使用我所知道的所有工具(processexplorer、tcpview、netstat-an等)尝试查找进程,但都没有成功。只有机器重启才能解决问题。但问题在一两个晚上又出现了。
阅读一些资料后,我发现我正在使用无限超时的sockect.accept(),因此我将其更改为 socket.setSoTimeout(15000); socket.accept(); 我已经使用新版本,但问题仍然存在。机器已升级Windows更新。我使用已完全更新的相同Windows版本进行测试,但无法复制。
我已经没有解决方案了。你有任何想法吗?
谢谢。

1
socket.accept(15000) 是什么? - user207421
当要求停止服务时,您能保证服务已经正确地停止了吗? - Compass
@Compass 进程已不再在任务管理器或进程管理器中列出。我也收到了我的最后一条日志消息 2018-07-19 04:05:02,875 [main] INFO CommunicationCoreServer - 已关闭。 - sbrisson
@EJP 我曾经读到过,我们不应该在accept上使用无限超时。有人在多核处理器上使用无限accept时遇到了问题(套接字仍然保持打开状态)。 - sbrisson
@EJP 进行了大量搜索。找不到链接了。无论如何,我同意这与问题无关。它也没有解决问题。 - sbrisson
显示剩余3条评论
3个回答

2

根据链接的答案更新Windows 7,也解决了我们的问题。谢谢。 - sergioFC

1
我也遇到了同样的问题。我有几个Java实例作为服务器运行,但是一旦其中任何一个Java应用程序被杀死并重新启动,它们就会失败,并抱怨端口仍在使用中。以前从未发生过这种情况,我经常重启它们。
我的Windows服务器机器也在几天前收到了一些新的更新。
顺便说一下,我正在使用一个工具来监视端口和应用程序,那些端口没有被任何程序使用,因此该应用程序实际上已经被杀死。

你找到解决方案了吗?或者是哪个Windows KB引起了这个问题? - sbrisson

1
我刚遇到了一个类似的情况。我正在构建一个Java Web服务器,它使用mysql-j-connector进行SQL操作。
我的目标是升级服务器,所以首先我通过管理客户端关闭了它。然后我编译并尝试运行新版本,但是返回了一个错误,说地址已经被占用。我尝试使用多种工具(有和没有root权限)来关闭使用目标端口的进程,但是都没有成功。
为了解决这个问题,我使用了Htop。
htop

原来mysql-j-connectior仍在运行,我不确定为什么。我终止了该进程(正如之前提到的,它并未注册使用所需的端口号),之后我就能够运行服务器了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接