开启JVM远程调试很简单,在jar启动命令上添加参数:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=<监听端口>
参数说明:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=<监听端口>
transport:指定了调试数据的传送方式,dt_socket是指用SOCKET模式,另有dt_shmem指用共享内存方式,其中,dt_shmem只适用于Windows平台;
address:调试服务器的端口号,客户端用来连接服务器的端口号;
server=y/n:当前JVM实例是否需要作为调试服务器执行,填y;
suspend=y/n:是否在调试客户端建立连接之后启动 VM,y的话vm启动时会挂起直到有一个客户端连接,填n;
完整Java启动命令示例:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:8002 -Xms256m -Xmx512m -XX:MetaspaceSize=256m -XX
:MaxMetaspaceSize=256m -jar xxx-1.0.0-release.jar
注意,这里address参数后面需要填 "0.0.0.0:8002",如果只配置了端口号没有指定ip,则JVM实例会拒绝外网的连接,这样你在本地使用idea等IDE就无法连接,也就无法远程调试!
检验jvm进程是否成功监听远程调试端口
检验的方式有很多,如 使用jinfo查询jvm的启动配置参数、使用arthas jvm打印jvm的信息等。
我这里使用netstat查看8002端口占用情况来判断:netstat -anp | grep 8002 ,打印结果:
后面的Java进程pid正是开启远程调试的jvm进程,说明开启成功。
另外,还可以在本地,windows环境可在CMD命令行窗口输入:
telnet yourip 8002
来尝试连接,可以正常连接则说明开启成功。
idea配置Java远程调试
Edit Configurations->Run/Debug Configurations->添加Remote JVM Debug,Host填入你的ip,远程调试端口,选择要调试的模块的classpath:
选择刚才配置好的远程调试配置,点击debug 图标,连接远程jvm调试:
连接成功打印: