2

众所周知,在jdk 5之后,无需指定-Xdebug调试,而是使用-agentlib:jdwp,但是否意味着调试模式消失了?这是否意味着Java程序将在没有任何性能折衷的情况下以正常模式运行,而您仍然可以随时附加它来调试它?

与 C/C++ 相比,您可以调试在优化模式下编译的应用程序,只要您不去除调试符号,尽管在优化模式下调试不是那么精确,因为例如某些函数是内联或消除的。所以顺便说一句,当您在构建应用程序时需要注意时,java是否有调试符号/信息的概念?

4

1 回答 1

1

众所周知,在jdk 5之后,不需要指定-Xdebug调试,而是使用-agentlib:jdwp,但这是否意味着调试模式消失了?

是的。老式的调试模式消失了。(-Xdebug现代 JVM 忽略了该选项。)

这是否意味着Java程序将在没有任何性能折衷的情况下以正常模式运行,而您仍然可以随时附加它来调试它?

例如,请参阅启用 JVMTI *capability* 以查询局部变量的开销。

有一些性能折衷1,但小于 with -Xdebug。JVMTI 代理会抑制一些JIT 编译器优化,而不是全部。

当您在构建应用程序时需要小心时,java 是否有调试符号/信息的概念?

是的,它确实。请参阅 的-g选项javac


1 - 大多数消息来源说成本很小或可以忽略不计,但我看到一条评论声称性能下降了 10 倍。目前尚不清楚这是否是-agentlib:jdwp……的成本,或者评论者对代理人做了什么。例如,如果您启用进入/退出跟踪,则性能成本是显着的。不幸的是,这都是轶事......

于 2018-07-04T11:27:33.510 回答