运行 Tomcat 在没有附件的调试模式下会影响性能吗?

Will running Tomcat in debug mode with no attachment affect performance?

假设我在调试模式下启动 Tomcat,但没有通过远程调试从 IDE 附加到它。我的应用程序 运行 是否会以与正常启动相同的速度运行,还是会影响速度和性能。如果有那么多少钱?

在不Tomcat重启的情况下解决问题时,调试模式确实非常方便。在生产调试模式下 运行 Tomcat 是个坏主意吗?

“调试模式”表示 JVM 与 jdwp 代理一起运行。

JDWP 代理启用大部分 JVM TI capabilities。其中有些是无害的,但有些 确实 对 HotSpot JVM 的性能有影响。

特别是,can_access_local_variables 能力 turns off 完全逃避分析。这意味着,某些 JIT 优化(例如分配消除)将不起作用。

其他功能,如 can_generate_method_entry_eventscan_generate_field_access_eventscan_pop_frame 等,在解释器中添加额外的检查。

请注意,仅存在 jdwp 代理就意味着上述开销,即使调试会话未处于活动状态。性能开销通常可以忽略不计,但有时缺少逃逸分析会增加分配压力并使应用程序减慢 5-10%。

此外,具有太多 classes 的应用程序可能会受到 jdwp 代理的严重影响。有时应用程序甚至可能挂起,如 . See bug JDK-8227269 中的详细信息。

代理处理 class loading/unloading 事件,即使没有附加调试器,所以同样,只有代理的存在可能已经导致问题。

简而言之,我不建议在生产环境中启用调试模式。虽然它经常工作得很好,但我多次看到 jdwp 相关问题,包括性能开销、冻结和本机内存泄漏。