最近遇到一個奇葩的問題,專案跑的好好的,沒有安裝其它特殊軟體,突然伺服器啟動報錯,日誌如下,顯然是伺服器的8080埠占用了。
Caused by: java.net.BindException: Address already in use: bind
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Net.java:438)
at sun.nio.ch.Net.bind(Net.java:430)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:225)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
at org.apache.tomcat.util.net.NioEndpoint.initServerSocket(NioEndpoint.java:218)
at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:194)
at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1328)
at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1341)
at org.apache.tomcat.util.net.AbstractJsseEndpoint.init(AbstractJsseEndpoint.java:241)
at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:695)
at org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11
很多同學容易想到的常規解決方法(windows上)就是使用如下命令找到對應的pid,然後進行關閉
netstat -ano | findstr :8080
但是我這邊用這個命令每次的結果都是空白的,也就是無法找到佔用8080埠的程序。
那麼windows埠占用,netstat無法找到,我們一般可以有哪些簡單和行之有效的解決方法呢?
方法1 強制關機
!!!就是按住電源鍵5秒以上,系統斷電。
有同學問為啥正常關機不就好了嗎?實際上也是經驗所得,正常關機有些程序會快取下來,佔用的埠也會在重啟後立馬就重新佔用。但是強制關機所有的程序及程式快取都會失效。
方法2 netstat 並使用windows10新增引數-q
透過查閱官網資料,從windows10開始,新增了一個-Q的引數能夠查詢出一種BOUND狀態下的程序,筆者無法找到的程序就是這種狀態的
使用示例:
netstat -anobq | findstr :8080
官網資料:
Netstat has been updated in Windows 10 with the addition of the -Q switch to show ports that have transitioned out of time wait as in the BOUND state. An update for Windows 8.1 and Windows Server 2012 R2 has been released that contains this functionality. The PowerShell cmdlet Get-NetTCPConnection in Windows 10 also shows these BOUND ports.
Until 10/2016, netstat was inaccurate. Fixes for netstat, back-ported to 2012 R2, allowed Netstat.exe and Get-NetTcpConnection to correctly report TCP or UDP port usage in Windows Server 2012 R2. See Windows Server 2012 R2: Ephemeral ports hotfixes to learn more.
方法3 修改windows動態埠範圍
有一些更新可能會使可使用埠的範圍有變化,比如Hyper-v
可使用如下命令更新保留埠範圍,保留埠範圍應該包含你使用埠
netsh interface ipv4 show excludedportrange protocol=tcp
net stop winnat
net stop LanmanWorkstation
net stop WlanSvc
net stop WwanSvc
netsh int ipv4 add excludedportrange protocol=tcp startport=8080 numberofports=1
net start winnat
net start LanmanWorkstation
net start WlanSvc
net start WwanSvc
使用如下命令更新動態埠範圍,該範圍應該在你使用的埠範圍外
netsh int ipv6 show dynamic tcp
netsh int ipv4 set dynamic tcp start=9001 num=16384