偶尔在启动 IDEA 或 PyCharm 时会失败并报错:java.net.BindException: Address already in use: bind。
现象
完整错误信息和报错截图如下:
完整错误信息 >folded
Internal error. Please refer to https://jb.gg/ide/critical-startup-errors
com.intellij.ide.plugins.StartupAbortedException: Cannot start app at com.intellij.idea.StartupUtil.lambda$start$15(StartupUtil.java:263) at java.base/java.util.concurrent.CompletableFuture.uniExceptionally(CompletableFuture.java:986) at java.base/java.util.concurrent.CompletableFuture$UniExceptionally.tryFire(CompletableFuture.java:970) at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506) at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1705) at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1692) at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290) at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020) at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656) at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594) at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183) Caused by: java.net.BindException: Address already in use: bind at java.base/sun.nio.ch.Net.bind0(Native Method) at java.base/sun.nio.ch.Net.bind(Net.java:459) at java.base/sun.nio.ch.Net.bind(Net.java:448) at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:227) at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:134) at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:562) at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1334) at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:506) at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:491) at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:973) at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:260) at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:356) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164) at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:469) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:503) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.base/java.lang.Thread.run(Thread.java:829)
----- Your JRE: 11.0.15+10-b2043.56 amd64 (JetBrains s.r.o.) C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.4\jbr
原因
大多数人遇到的这个问题都是因为启用了 WSL 2,原因如下:
IDEA 在启动时会从 6942 至 6991 范围内选择一个可用的端口用作内部的 IPC 通信;
Windows 为了与 WSL 2 端口互通,需要预留大段端口做转发,因此可能会占用到 IDEA 选择范围内的所有端口;
排除端口(Excluded Port)是 Windows 内核预留的一部分端口,避免被其他进程占用导致NAT/Hyper-V/Windows Defender 等系统组件无法正常工作。除了系统预留的端口外,用户也可以手动指定排除端口,用户排除端口不会被系统分配给系统组件,但可以被 IDEA 等程序使用。
for port inrange(start_port, start_port + num_ports_to_occupy): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 设置为ipv4和使用tcp协议 s.bind(('localhost', port)) # 绑定地址和端口 s.listen(1) sockets.append(s)
print(f"Occupied ports {start_port} to {start_port + num_ports_to_occupy - 1}") input("Press Enter to release ports and exit...") for s in sockets: s.close()
运行脚本占用 6942 至 6991 端口,此时再运行 IDEA 就会报错;如果修改脚本减少一个占用的端口,此时 IDEA 能够启动。