启动JVM远程调试功能详解:背后的工作原理与实践操作指南
前言
以前有篇文章,讲解Tomcat开启远程调试功能,只是讲解了用法,以及Tomcat的作者书写脚本的初衷。原理没写,其实不是Tomcat的具有远程调试功能,是JVM虚拟机提供的能力,Java应用都能开启远程调试能力。上一篇文章:tomcat intellij远程调试
1. demo
随意写一个Java应用。
public class MapMain {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("aa", "aa");
map.put("bb", "bb");
map.put("cc", "cc");
map.put("dd", "dd");
map.put("ff", "f");
Set<Map.Entry<String, String>> entrySet = map.entrySet();
for (Map.Entry<String, String> entry : entrySet) {
System.out.println(entry.getKey() + " ------ " + entry.getValue());
}
}
}
执行mvn package,打包成class文件
2. 通过JPDA开启调试
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=9093 com.feng.map.demo.MapMain
通过上面的执行方式,即可开启远程调试,并阻塞当前应用启动,知道远程连接接入
ide即可配置好远程JVM Debug
如上,笔者就可以远程调试了。
3. 原理分析
其实就是JVM参数开启远程debug,那么我们看看Tomcat是否是这样的。
3.1 Tomcat远程调试原理分析
直接查看Tomcat的bin目录的catalina.sh,win查看catalina.bat。Tomcat9版本
可以看到Tomcat也是使用我们在demo相同的参数开启远程debug能力的,jpda即Tomcat的catalina启动第一个参数,那么远程调试就是jpda?
3.2 Oracle官网说明
Java Platform Debugger Architecture (JPDA),JDK8的接口文档
参考上面Oracle官网的文档,实现调试能力的协议是JDWP
协议
The Java Debug Wire Protocol (JDWP) is the protocol used for communication between a debugger and the Java virtual machine (VM) which it debugs (hereafter called the target VM).
那么JVM的接口呢?
可以看到笔者是jdk8的文档,JVMDI接口已经移除了,那么现在使用的是JVMTI
The JVM tool interface (JVM TI) is a native programming interface for use by tools. It provides both a way to inspect the state and to control the execution of applications running in the Java virtual machine (JVM). JVM TI supports the full breadth of tools that need access to JVM state, including but not limited to: profiling, debugging, monitoring, thread analysis, and coverage analysis tools.
Note: JVM TI was introduced at JDK 5.0. JVM TI replaced the Java Virtual Machine Profiler Interface (JVMPI) and the Java Virtual Machine Debug Interface (JVMDI) which, as of JDK 6, are no longer provided.
大致意思是JVM TI可以支持访问JVM状态,包括调试,监控,线程分析等,替代了JVMPI和JVMDI
3.3 主要参数讲解
transport
指ide与运行的程序之间的协议:dt_socket
: 采用socket
方式连接,这是最常用的方式。
server
这个表示作为主动方还是被动方,即attach到jvm,还是监听jvm。attach为y,监听listen为n。
suspend
当应用启动后,是否阻塞应用直到被连接,默认值为y
(阻塞),一般需要设置n,即不阻塞。但是当需要调试的程序是启动时执行的时候,需要设置y,方便启动调试
address
调试端口,即transport的端口,用于调试的socket连接,不能与应用使用的端口冲突。
其他
onthrow=<FQ exception class name>,onuncaught=<y/n>
指应用在抛出异常类或者未捕获异常时,退出调试。
总结
其实这些功能都是JVM提供的,类似Spring Boot与Tomcat或者其他Java应用也是JVM在后面起作用,这些都是封装JVM启动参数来达到调试的原理。IDE工具亦是如此,只是图形化做得很好。另外小技巧:当如果有防火墙时,可以临时使用8080这类已经开通的作为调试端口,用其他端口启动应用,调试结束就换参数即可,避免临时开墙的困扰。
推荐阅读
-
【2022新手指南】Java编程进阶之路 - 六、技术架构篇 ### MySQL索引底层解析与优化实战 - 你会讲解MySQL索引的数据结构吗?性能调优技巧知多少? - Redis深度揭秘:你知道多少?从基础到哨兵、主从复制全梳理 - Redis持久化及哨兵模式详解,还有集群搭建和Leader选举黑箱打开 - Zookeeper是个啥?特性和应用场景大公开 - ZooKeeper集群搭建攻略及 Leader选举、读写一致性、共享锁实现细节 - 探究ZooKeeper中的Leader选举机制及其在分布式环境中的作用 - Zab协议深入剖析:原理、功能与在Zookeeper中的核心地位 - RabbitMQ全方位解读:工作模式、消费限流、可靠投递与配置策略 - 设计者视角:RabbitMQ过期时间、死信队列与延时队列实践指南 - RocketMQ特性和应用场景揭示:理解其精髓与差异化优势 - Kafka详细介绍:特性及广泛应用于实时数据处理的场景解析 - ElasticSearch实力揭秘:特性概述与作为搜索引擎的广泛应用 - MongoDB认知升级:非关系型数据库的优势阐述,安装与使用实战教学 - BIO/NIO/AIO网络模型对比:掌握它们的区别与在网络编程中的实际应用 - Netty带你飞:理解其超快速度背后的秘密,包括线程模型分析 - 网络通信黑科技:Netty编解码原理与常用编解码器的应用,Protostuff实战演示 - 解密Netty粘包与拆包现象,怎样有效应对这一常见问题 - 自定义Netty心跳检测机制,轻松调整检测间隔时间的艺术 - Dubbo轻骑兵介绍:核心特性概览,服务降级实战与其实现益处 - Dubbo三大神器解读:本地存根与本地伪装的实战运用与优势呈现 ----------------------- 七、结语与回顾
-
启动JVM远程调试功能详解:背后的工作原理与实践操作指南