Java应用程序会因为存在-Xdebug而变慢,还是仅在单步执行代码时变慢?

2022-09-01 23:22:41

我意识到Java代码在调试器中运行时会变慢

问题是,仅仅通过使用这些选项启动Java,代码会减慢速度吗:

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

??

还是只有在连接到“调试端口”并使用IDE实际单步执行代码时才会发生减速?


答案 1

首先,严格回答你的问题 (至少如其标题中所述) 仅在 5.0 之前的 JVM 中使用 JVMDI 在 VM 中启用调试支持。因此,就其本身而言,它并没有多大作用。此外,JVMDI 从 5.0 开始被弃用,取而代之的是 JVMTI-Xdebug

-Xdebug
从启用对 JVMDI 的支持开始。JVMDI 已被弃用,并且不用于 J2SE 5.0 中的调试,因此在 J2SE 5.0 中调试时不需要此选项。

所以-Xdebug不再做任何事情了,重要的部分是:

-Xrunjdwp:<name1>[=<value1>],<name2>[=<value2>]...

或者,从 Java 5.0 开始,较新的(您应该更喜欢,因为 5.0 中的 JDWP 代理使用 JVM TI 接口而不是旧的 JVMDI 接口):

--agentlib:jdwp=<name1>[=<value1>],<name2>[=<value2>]...

现在,据我所知,只是加载 jwdp 代理和/或配置 JVM 以侦听给定端口上的套接字连接不会对性能产生任何明显的影响。但连接调试器可以。


答案 2

AMD的性能测试结果表明,无论是否连接了调试器,仅仅通过JVM命令行启用调试代理确实会导致性能下降,并且根据工作负载的不同,降级可能会很大:

请注意,在测量性能时,我们实际上并没有附加调试器,因此我们假设此 agentlib 选项在此使用方案中是性能中立的。删除此选项后,CPU 利用率和此工作负载的性能(以每秒处理的请求数衡量)都得到了显著提高。

查看他们的报告:

http://developer.amd.com/resources/documentation-articles/articles-whitepapers/java-performance-when-debugging-is-enabled/

上面的链接是死的,这是一个网络存档链接:https://web.archive.org/web/20160316201129/http://developer.amd.com/resources/documentation-articles/articles-whitepapers/java-performance-when-debugging-is-enabled/