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 表示强制执行
-
方法二 在任务管理器中选择发生冲突的进程,右击选择结束任务。