java远程调试。
概述。
Java远程调试的开启和底层原理。
开启Java远程调试。
Java远程调试允许开发人员进行本地IDE༈比如Eclipse、IntelliJ IDEA等)Java应用程序在远程服务器上进行中调试。以下是开启Java远程调试的基本步骤:
在远程服务器上配置Java应用程序。:
- 启动Java应用程序时,远程调试是通过添加JVM参数来启用的。通常包括这些参数。
java.debug。
、。java.debug.port。
(#xff09指定调试端口;、。java.debug.server。
(通常设置为。y。
或。n。
,这取决于服务器模式是否)等,但在实际使用中,我们更常用的是。-agentlib:jdwp。
参数及其子参数。 - 例如,假设我们想在端口5005上开始远程调试,以下参数可以添加到启动命令中a;
java。-agentlib:jdwp。=transport。=dt_socket,server。=y,suspend。=n,address。=5005。-jar。your-application.jar。
transport=dt_socket。
:指定使用套接字传输。server=y。
:表示目前JVM作为调试服务器。suspend=n。
:表示JVM在启动时不会暂停,立即执行。假如设置为。y。
,在等待调试器连接时,JVM将暂停。address=5005。
:指定调试端口。
配置本地IDE。:
- 在IDE中创建远程调试配置。
- IP地址和指定远程主机的调试端口(与服务器上的配置相同)。
- 连接并开始调试。
底层原理。
Java远程调试的基本原理主要取决于Java Debug Wire Protocol(JDWP)Java虚拟机(JVM)调试接口。
JDWP。:
- JDWP是Java应用程序调试的通信协议。它定义了调试器(IDE中的调试工具)Java虚拟机和被调试的xff08;JVM)通信规范之间。
- JDWP支持各种调试功能,如设置断点、单步执行、查看变量值、监控线程等。
- JDWP使用套接字(Socket)#xff0作为通信传输层c;因此,调试器和JVM之间需要建立网络连接。
JVM调试接口。:
- JVM提供调试接口(通常被称为Java Virtual Machine Tool Interface,JVMTI或Java Debug Interface,JDI),允许调试器与JVM交互。
- JVM启动时,若指定。
-agentlib:jdwp。
参数,JDWP代理库将由JVM加载。该代理库实现了JDWP协议,并且是JVM和调试器之间的桥梁。 - 调试器通过JDWP协议向JVM发送调试命令c;JVM通过JDWP代理库接收这些命令,并按命令执行相应的调试操作。
通信过程。:
- 当调试器连接到远程JVM时,#xff0c;JDWP会话会在他们之间建立。
- 调试器可以发送各种JDWP命令查询JVM状态,控制JVM执行(暂停和恢复线程)、读取和修改变量值等。
- JVM通过JDWP代理库接收这些命令,并调用相应的JVM调试接口来实现调试功能。
- 调试中的数据(如变量值、线程状态等)调试器和JVM之间也将通过JDWP协议传输。
总之,通过JDWP协议和JVM调试接口,Java远程调试实现了调试器与远程JVM之间的通信和交互。在远程服务器上运行的Java应用程序,开发者可以在本地IDE中轻松调试。
JVM参数。
以下是一些常见的JVM参数,以表格形式显示,并附上使用样例:
参数类别。 | 参数名称。 | 说明。 | 使用样例。 |
---|
标准参数。 | -version。 | 显示Java版本的信息。 | java -version。 |
-help。 | 使用Java命令显示帮助。 | java -help。 |
-server。 | JVM启动Server模式。 | java -server -jar MyApp.jar。 |
-cp 或 -classpath。 | 指定类搜索路径。 | java -cp .;lib/mylib.jar MyApp。 |
非标准参数(-X) | -Xint。 | 解释执行JIT编译不执行。 | java -Xint -jar MyApp.jar。 |
-Xcomp。 | 首次使用编译成本代码。 | java -Xcomp -jar MyApp.jar。 |
-Xmixed。 | #xfff0混合模式c;JVM决定解释执行还是编译执行。 | java -Xmixed -jar MyApp.jar。 |
非标准参数(-XX) | Boolean类型。 | -XX:[±]name。 | java -XX:+UseG1GC -jar MyApp.jar(启用G1垃圾回收器) |
java -XX:-UseConcMarkSweepGC -jar MyApp.jar(禁用CMS垃圾回收器) |
非Boolean类型。 | -XX:name=value。 | java -XX:MaxGCPauseMillis=500 -jar MyApp.jar(最大GC停顿时间为500毫秒) |
java -XX:HeapDumpPath=/path/to/dump -jar MyApp.jar(设置堆储文件路径) |
内存管理。 | -Xms。 | 设置JVM初始堆内存的大小。 | java -Xms512m -jar MyApp.jar(512MB) |
-Xmx。 | 设置JVM最大堆内存大小。 | java -Xmx2g -jar MyApp.jar(2GB) |
-Xmn。 | 设置新一代大小。 | java -Xmn256m -jar MyApp.jar(256MB) |
-XX:NewRatio。 | 设置新生代和老年人的比例。 | java -XX:NewRatio=3 -jar MyApp.jar(新生代:老年人=1:3) |
-XX:SurvivorRatio。 | 设置Eden区域与Survivor区域的比例。 | java -XX:SurvivorRatio=4 -jar MyApp.jar(Eden:Survivor=4:1) |
垃圾回收。 | -XX:+UseG1GC。 | G1垃圾回收器启用。 | 如上所示。 |
-XX:+UseConcMarkSweepGC。 | 启用CMS垃圾回收器(Java 之前) | 如上述禁用示例所示。 |
-XX:+HeapDumpOnOutOfMemoryError。 | 堆转存文件在内存溢出时生成。 | 如上所示,堆转储路径示例为#xff0c;这个参数可以结合使用。 |
性能优化。 | -XX:+TieredCompilation。 | 启用多层次编译器。 | java -XX:+TieredCompilation -jar MyApp.jar。 |
-XX:+UseCompressedOops。 | 用指针压缩。 | java -XX:+UseCompressedOops -jar MyApp.jar。 |
调试和监控。 | -XX:+PrintGCDetails。 | 打印详细的GC日志。 | java -XX:+PrintGCDetails -jar MyApp.jar。 |
-XX:+PrintGCDateStamps。 | 打印GC发生的时间戳。 | java -XX:+PrintGCDateStamps -jar MyApp.jar。 |
-Xloggc:。 | 指定GC日志文件的路径。 | java -Xloggc:gc.log -jar MyApp.jar。 |
注意。:
- 上表中的参数仅为示例,并非所有JVM参数。有很多JVM参数并且随着Java版本的更新,新参数可能被引入或废弃。
- 在实际使用中c;参数应根据应用程序的具体要求和硬件环境进行配置和调整。
- 某些参数可能需要在特定的JVM版本或模式下才能有效。
- 使用非标准参数(-X和-XX)时,谨慎行事因为这些参数可能在不同版本的JVM中不同,而某些参数可能会导致JVM行为不稳定或性能下降。