我使用:
创建了一个ServerSocketInetSocketAddress inetsktaddr = new InetSocketAddress(0);
ServerSocket sckt = new ServerSocket();
sckt.bind(inetsktaddr);
Socket socket = sckt.accept();
当应用程序运行时,使用我发现的netstat,
TCP 0.0.0.0:49906 0.0.0.0:0 LISTENING 9196
TCP [::]:49906 [::]:0 LISTENING 9196
当应用程序崩溃时,netstat结果显示:
TCP [::]:49906 [::]:0 LISTENING 9196
当搜索进程id 9196时,不存在这样的进程。它是应用程序运行时的java.exe进程ID。这是怎么发生的?
我使用的是java 1.5和Windows 7 Professional
修改
过了一段时间后,我发现了以下内容: 我的应用程序启动mysql数据库。有时当java.exe崩溃时,mysql不会崩溃。数据库服务器将仅启动。当这个问题出现时(::独自处于侦听状态),我杀死了mysql进程,立即说明:: socket停止侦听。因此,当java崩溃时,mysql会以某种方式阻止::消失。无法找到原因。
答案 0 :(得分:0)
Atlast我找到了原因,它是一个JVM Bug。 (http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6598160)
子进程只会继承IPV6 SOCKET HANDLES而不是IPV4 SOCKET HANDLES。因此问题出现在我身上。
修复是我应该升级JVM或仅在ipv4服务器套接字中监听。