运行 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_events
、can_generate_field_access_events
、can_pop_frame
等,在解释器中添加额外的检查。
请注意,仅存在 jdwp 代理就意味着上述开销,即使调试会话未处于活动状态。性能开销通常可以忽略不计,但有时缺少逃逸分析会增加分配压力并使应用程序减慢 5-10%。
此外,具有太多 classes 的应用程序可能会受到 jdwp
代理的严重影响。有时应用程序甚至可能挂起,如 . See bug JDK-8227269 中的详细信息。
代理处理 class loading/unloading 事件,即使没有附加调试器,所以同样,只有代理的存在可能已经导致问题。
简而言之,我不建议在生产环境中启用调试模式。虽然它经常工作得很好,但我多次看到 jdwp 相关问题,包括性能开销、冻结和本机内存泄漏。
假设我在调试模式下启动 Tomcat,但没有通过远程调试从 IDE 附加到它。我的应用程序 运行 是否会以与正常启动相同的速度运行,还是会影响速度和性能。如果有那么多少钱?
在不Tomcat重启的情况下解决问题时,调试模式确实非常方便。在生产调试模式下 运行 Tomcat 是个坏主意吗?
“调试模式”表示 JVM 与 jdwp
代理一起运行。
JDWP 代理启用大部分 JVM TI capabilities。其中有些是无害的,但有些 确实 对 HotSpot JVM 的性能有影响。
特别是,can_access_local_variables
能力 turns off 完全逃避分析。这意味着,某些 JIT 优化(例如分配消除)将不起作用。
其他功能,如 can_generate_method_entry_events
、can_generate_field_access_events
、can_pop_frame
等,在解释器中添加额外的检查。
请注意,仅存在 jdwp 代理就意味着上述开销,即使调试会话未处于活动状态。性能开销通常可以忽略不计,但有时缺少逃逸分析会增加分配压力并使应用程序减慢 5-10%。
此外,具有太多 classes 的应用程序可能会受到 jdwp
代理的严重影响。有时应用程序甚至可能挂起,如
代理处理 class loading/unloading 事件,即使没有附加调试器,所以同样,只有代理的存在可能已经导致问题。
简而言之,我不建议在生产环境中启用调试模式。虽然它经常工作得很好,但我多次看到 jdwp 相关问题,包括性能开销、冻结和本机内存泄漏。