异常现象
为了在本地测试socket服务端,写了一个socket客户端,之前一直是可以用的,某天突然发现在启动sokcet客户端时一直启动不了,报错如下:
错误: 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 8011; nested exception is:
java.net.BindException: Address already in use: JVM_Bind
异常分析
根据错误提示是8011端口被占用,在系统命令窗口输入:netstat -ano,查看8011确实是被占用:
其中5522端口是socket服务端的端口,并且使用5522端口和8011端口的是同一个PID:7836。
继续输入:netstat -ano|findstr “7836”,查看7836对应的信息:
继续输入tasklist|findstr “7836”,回车,查看是哪个进程或者程序占用了5522和8011端口,结果是:javaw.exe
javaw.exe是jdk中的带的一个程序。
输入命令:taskkill /F /pid 7836,可以看到进程7836已关闭,并且socket服务端也停止。
经过多次重试,发现每次启动socket服务端,socket服务端的端口5522对应的线程下都包含一个8011端口。
考虑到代码中没有使用8011端口,怀疑是不是Eclipse的问题,故在IDEA中导入项目,运行没有报错。比对了一下Eclipse和IDEA依赖的环境,发现:IDEA配置的JDK是jdk1.8.0_192,而Eclipse中配置的jdk1.8.0_73。
查看Eclipse中配置的JDK:
把jdk1.8.0_192添加进去并设成默认,重新启动项目没有报错。
分析了一下,产生这种异常的原因,可能是由于特定Eclipse的版本bug导致的。
Luna Service Release 1 (4.4.1)
Eclipse 版本信息:
Version: Luna Service Release 1 (4.4.1)
Build id: 20140925-1800
1:前提条件都是:64位系统安装的64位JDK jdk1.8.0_192,32位版本Eclipse启动时配置的32位JDKjdk1.8.0_73
1.1:项目编译配置的是32位JDKjdk1.8.0_73,启动正常。
1.2:项目编译配置的是64位JDKjdk1.8.0_192,启动正常。
2:前提条件都是:64位系统安装的32位JDK jdk1.8.0_73,32位版本Eclipse启动时配置的32位JDKjdk1.8.0_73
2.1:项目编译配置的是32位JDKjdk1.8.0_73,启动正常。
2.2:项目编译配置的是64位JDKjdk1.8.0_192,启动正常。
Oxygen.3 Release (4.7.3)
Eclipse 版本信息:
Version: Oxygen.3 Release (4.7.3)
Build id: 20180308-1800
1:前提条件都是:64位系统安装的64位JDK jdk1.8.0_192,32位版本Eclipse启动时配置的32位JDKjdk1.8.0_73
1.1:项目编译配置的也是32位JDKjdk1.8.0_73,启动报错:
1.2:项目编译配置的是64位JDKjdk1.8.0_192,启动正常:
2:前提条件都是:64位系统安装的32位JDK jdk1.8.0_73,32位版本Eclipse启动时配置的32位JDKjdk1.8.0_73
2.1:项目编译配置的是32位JDKjdk1.8.0_73,启动报错:
2.2:项目编译配置的是64位JDKjdk1.8.0_192,启动正常。
2019-06 (4.12.0)
Eclipse 版本信息:
Version: 2019-06 (4.12.0)
Build id: 20190614-1200
1:前提条件都是:64位系统安装的64位JDK jdk1.8.0_192,64位版本Eclipse启动时使用的默认配置的64位JDKjdk1.8.0_192
1.1:项目编译配置的也是32位JDKjdk1.8.0_73,启动正常。
1.2:项目编译配置的是64位JDKjdk1.8.0_192,启动正常。
2:前提条件都是:64位系统安装的32位JDK jdk1.8.0_73,64位版本Eclipse启动时配置的64位JDKjdk1.8.0_192
2.1:项目编译配置的是32位JDKjdk1.8.0_73,启动正常。
2.2:项目编译配置的是64位JDKjdk1.8.0_192,启动正常。
解决办法
更换出现异常的Eclipse的版本,同时最好64系统安装64JDK,并且使用64位版本的Eclipse。