我知道需要设置一些JAVA_OPTS来远程调试Java程序。

它们是什么?它们的含义是什么?


当前回答

在Java 5.0之前,使用-Xdebug和-Xrunjdwp参数。这些选项在以后的版本中仍然可以工作,但是它将以解释模式而不是JIT模式运行,后者会更慢。

从Java 5.0开始,最好使用-agentlib:jdwp单一选项:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=1044

-Xrunjdwp或agentlib:jdwp参数的选项有:

transport=dt_socket:表示用来连接JVM的方式(socket是一个很好的选择,它可以用来调试远程计算机) 地址=8000:TCP/IP端口公开,从调试器连接, suspend=y:如果'y',告诉JVM等待调试器附加开始执行,否则(如果'n'),立即开始执行。

其他回答

我收藏了这篇为Java 5及以下版本设置的文章。

基本上运行它:

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044

对于Java 5及以上版本,使用以下命令运行:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=1044

如果您希望Java在执行应用程序之前等待您连接,请将suspend=n替换为suspend=y。

在Java 5.0之前,使用-Xdebug和-Xrunjdwp参数。这些选项在以后的版本中仍然可以工作,但是它将以解释模式而不是JIT模式运行,后者会更慢。

从Java 5.0开始,最好使用-agentlib:jdwp单一选项:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=1044

-Xrunjdwp或agentlib:jdwp参数的选项有:

transport=dt_socket:表示用来连接JVM的方式(socket是一个很好的选择,它可以用来调试远程计算机) 地址=8000:TCP/IP端口公开,从调试器连接, suspend=y:如果'y',告诉JVM等待调试器附加开始执行,否则(如果'n'),立即开始执行。

如果你使用java 9或更高版本,要远程调试(当你在本地使用docker时也是如此),你必须提供——debug *:($port)。因为从java 9——debug ($port)将只允许在本地调试,而不是远程调试。

因此,您可以在docker-compose中提供命令 命令:——/opt/jboss/wildfly/bin/standalone.sh——debug *:8787

对于java 1.5或更高版本:

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 <YourAppName>

对于java1.4:

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 <YourAppName>

对于java1.3:

java -Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 <YourAppName>

下面是一个简单程序的输出:

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044 HelloWhirled
Listening for transport dt_socket at address: 1044
Hello whirled

命令行

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=PORT_NUMBER

Gradle

gradle bootrun --debug-jvm

Maven

mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=PORT_NUMBER