问题背景
本来好好的,突然某天重启电脑,重启tomcat服务后,竟然启动失败了。
严重: StandardServer.await: create[localhost:8005]:
java.net.BindException: Cannot assign requested address: JVM_Bind
at java.net.DualStackPlainSocketImpl.bind0(Native Method)
at java.net.DualStackPlainSocketImpl.socketBind(DualStackPlainSocketImpl.java:106)
at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387)
at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:190)
at java.net.ServerSocket.bind(ServerSocket.java:375)
at java.net.ServerSocket.(ServerSocket.java:237)
at org.apache.catalina.core.StandardServer.await(StandardServer.java:444)
at org.apache.catalina.startup.Catalina.await(Catalina.java:782)
at org.apache.catalina.startup.Catalina.start(Catalina.java:728)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:294)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:428)
问题分析
关键提示信息 Cannot assign requested address: JVM_Bind ,搜索相关资料后,得知是访问的域名:端口绑定失败。
1、查看访问的url:http://localhost:8080/,所以域名是localhost,端口是8080
ping localhost
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
127.0.0.1 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms
返回127.0.0.1,所以域名应该没问题是127.0.0.1(然而是假象,真实原因继续往下看),接下来再查看端口
2、查看端口是否被占用
cmd命令行窗口下,执行netstat -ano | findstr “8080”
TCP 127.0.0.1:58205 127.0.0.1:8080 SYN_SENT 8816
TCP 127.0.0.1:58206 127.0.0.1:8080 SYN_SENT 8816
TCP 127.0.0.1:58208 127.0.0.1:8080 SYN_SENT 8816
TCP [::1]:58209 [::1]:8080 SYN_SENT 8816
TCP [::1]:58210 [::1]:8080 SYN_SENT 8816
TCP [::1]:58211 [::1]:8080 SYN_SENT 8816
可以看到pid为8816的进程占用了8080端口(那就是端口占用问题喽,然而还是假象,真实 原因继续往下看 )
强制删除进程
taskkill /PID 8816
返回
成功: 给进程发送了终止信号,进程的 PID 为 8816。
删除成功,这下子应该可以正常启动了吧,赶紧测试下。
3、重启tomcat验证
结果还是不行,一模一样的错误,又报了一遍。难道资料找错了,不是这种问题;但是jvm_bind明显又是绑定的问题,重新捋一捋。查看下8080端口到底是谁占用的,是不是kill掉又启动了。
先查出pid 8816到底是谁,
cmd执行
wmic process get name,executablepath,processid|findstr 8816
java.exe 6276
是java.exe,真是这个吗,kill掉,再重启tomcat,结果还是一样的报错。应该不是端口的问题了,现在高度怀疑localhost本地域有问题
查看本地hosts文件,发现竟然绑定了一个地址192.168.10.100,而本机当下的地址是192.168.10.123(dhcp动态分配的),那一定就是这个问题了,注释掉,重新启动tomcat,熟悉的滚动日志,最后的访问页面又愉快的出现了。搞定。
总结
排查问题:1、搜索关键词,百度、google过滤之;2、按照资料方法修改、验证;3、带着思考使用资料中的方式,毕竟别人出现的场景跟自己的情况或多或少有差异。