IDEA调试过程发生端口冲突原因和解决方法

本文详细分析了在IDEA中调试时遇到的端口冲突问题,指出'Connected to the target VM...'实际上是正常运行信息,并非错误。端口冲突可能是由于未正确停止前次调试或多个进程占用同一端口。通过任务管理器查看并结束相关进程或在命令行中强制关闭进程是解决此类问题的方法。作者反思了对Spring原理和Java多线程理解的不足,并鼓励深入学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


2019-1-24更正
在使用IDEA调试程序时候出现Connected to the target VM, address: ‘127.0.0.1:60504’, transport: ‘socket’信息,这个信息并不是错误信息,而是提示当前虚拟机跑的java程序端口号是60504。之前以为是出现端口号占用问题,然而并不是。
事情是这样的:
这是一段最简单的java代码

    public static void main(String[] agrs){
        System.out.println("测试");
    }

在IDEA中使用debug调试这段代码,控制台会输出以下内容
在这里插入图片描述
看这5行信息,第一行就是jdk中java.exe开始编译Java代码,第二行就是误以为的错误信息,其实是表示JVM开始跑编译好的java代码,也就是.class文件,JVM运行占用的端口号就是57102。第三行就是程序中的输出。第四行表示程序运行结束。第五行表示进程成功结束。
然而,在我之前的程序中有这样一段代码:

    public static void main(String[] agrs){
        ApplicationContext ac = new ClassPathXmlApplicationContext("classpath*:applicationContext.xml");

        System.out.println("测试");
    }

就是使用Spring容器去调用一些Bean,xml中有自动扫描项目根目录的代码,所以就将项目中的所有Bean都加载了进来。再次使用debug调试代码,控制台输出的就是一大堆的bean加载信息。
当时我在测试代码中打了断点,但是一直调试不了,也就是下图中调试按钮都是灰色,然后只有这样一段提示信息,当时就以为是错误信息,后面发现,程序是完全没有问题的,就是我打断点的位置程序根本就没有运行到,当时我的断点打在一个条件判断语句里面,但是我的判断条件写的有问题,所以调试程序没跑到断点处,当然没法调试。
在这里插入图片描述
再看看Threads信息
在这里插入图片描述
可以发现main线程是wait是阻塞状态,还有一些非守护线程,如数据库连接池,还有一些定时任务执行的线程都在运行。程序没有发生错误,只是main线程因为一些非守护线程还在运行,所以main线程一直没有结束,也就是整个程序一直在运行。所以也不会有disconnected from VM 和process finished的信息。

总结:遇到这个问题本来就是没有认真分析代码和没有详细关注提示信息导致的,从另一方面反应了自己对于Spring原理的认识还有欠缺,对于Java虚拟机的原理和Java多线程方面的知识了解的还远远不够,希望能在实践中慢慢深入了解。
<-----------------------------------------------------------分割线------------------------------------------------------------->
问题:
在IDEA中打断点debug程序的时候出现了这个错误,导致无法调试程序。
原因:
无论是使用Tomcat跑web程序还是跑简单的java SE程序,都可能遇到这个问题,都是端口号被占用导致的。如果是跑Java se的简单程序出现端口号占用的问题可能是由于多次运行或者多次debug没有终止前一次的执行任务导致端口号冲突。如果是Tomcat跑web项目可能是多次执行导致端口冲突,也可能是在tomcat的bin目录下开启了tomcat服务,又同时在IDE中使用改tomcat跑web程序,这样也会出现端口号冲突。
分析:
我的错误提示是:Connected to the target VM, address: ‘127.0.0.1:60504’, transport: ‘socket’,可以知道发生冲突的端口号是60504。

  • 使用 netstat -aon|findstr [端口号]查看该端口被哪些进程占用
    在这里插入图片描述
    可以看到该端口被两个进程占用
  • 使用tasklist|findstr [PID]查看这两个运行的进程
    在这里插入图片描述
  • 到任务管理器中找到这两个进程
    在这里插入图片描述
    可以看到发生冲突的两个进程信息。

解决方法:

  • 方法一 在cmd中kill这两个进程
    根据进程ID kill进程 taskkill /f /pid [PID]

    根据进程名称kill进程 taskkill /f /im [进程名]

    /f 表示强制执行
    在这里插入图片描述

  • 方法二 在任务管理器中选择发生冲突的进程,右击选择结束任务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值