众所周知,在jdk 5之后,无需指定-Xdebug
调试,而是使用-agentlib:jdwp
,但是否意味着调试模式消失了?这是否意味着Java程序将在没有任何性能折衷的情况下以正常模式运行,而您仍然可以随时附加它来调试它?
与 C/C++ 相比,您可以调试在优化模式下编译的应用程序,只要您不去除调试符号,尽管在优化模式下调试不是那么精确,因为例如某些函数是内联或消除的。所以顺便说一句,当您在构建应用程序时需要注意时,java是否有调试符号/信息的概念?
众所周知,在jdk 5之后,不需要指定
-Xdebug
调试,而是使用-agentlib:jdwp,但这是否意味着调试模式消失了?
是的。老式的调试模式消失了。(-Xdebug
现代 JVM 忽略了该选项。)
这是否意味着Java程序将在没有任何性能折衷的情况下以正常模式运行,而您仍然可以随时附加它来调试它?
例如,请参阅启用 JVMTI *capability* 以查询局部变量的开销。
有一些性能折衷1,但小于 with -Xdebug
。JVMTI 代理会抑制一些JIT 编译器优化,而不是全部。
当您在构建应用程序时需要小心时,java 是否有调试符号/信息的概念?
是的,它确实。请参阅 的-g
选项javac
。
1 - 大多数消息来源说成本很小或可以忽略不计,但我看到一条评论声称性能下降了 10 倍。目前尚不清楚这是否是-agentlib:jdwp
……的成本,或者评论者对代理人做了什么。例如,如果您启用进入/退出跟踪,则性能成本是显着的。不幸的是,这都是轶事......