【发布时间】:2020-11-07 22:38:23
【问题描述】:
假设我以调试模式启动 Tomcat,但没有通过远程调试从 IDE 附加到它。我的应用程序会以与正常启动相同的速度运行,还是会影响速度和性能。如果有的话,多少钱?
调试模式在解决问题时非常方便,无需重启 Tomcat。在生产环境中以调试模式运行 Tomcat 是不是很糟糕?
【问题讨论】:
标签: performance tomcat jvm remote-debugging production
假设我以调试模式启动 Tomcat,但没有通过远程调试从 IDE 附加到它。我的应用程序会以与正常启动相同的速度运行,还是会影响速度和性能。如果有的话,多少钱?
调试模式在解决问题时非常方便,无需重启 Tomcat。在生产环境中以调试模式运行 Tomcat 是不是很糟糕?
【问题讨论】:
标签: performance tomcat jvm remote-debugging production
“调试模式”表示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%。
此外,具有太多类的应用程序可能会受到jdwp 代理的严重影响。有时应用程序甚至可能挂起,例如在this question 中。有关详细信息,请参阅错误JDK-8227269。
即使没有附加调试器,代理也会处理类加载/卸载事件,所以同样,只有代理的存在可能已经导致问题。
简而言之,我不建议在生产环境中启用调试模式。虽然它通常工作得很好,但我多次看到 jdwp 相关的问题,包括性能开销、冻结和本机内存泄漏。
【讨论】: