performance - 在没有附件的调试模式下运行 Tomcat 会影响性能吗?
问题描述
假设我以调试模式启动 Tomcat,但没有通过远程调试从 IDE 附加到它。我的应用程序会以与正常启动相同的速度运行,还是会影响速度和性能。如果有,那么多少钱?
在不重启 Tomcat 的情况下修复问题时,调试模式非常方便。在生产中以调试模式运行 Tomcat 是不是坏主意?
解决方案
“调试模式”意味着 JVM 与jdwp
代理一起运行。
JDWP 代理支持大多数JVM TI 功能。其中一些是无害的,但有些确实会对 HotSpot JVM 的性能产生影响。
特别是,can_access_local_variables
功能完全关闭逃逸分析。这意味着,某些 JIT 优化(例如分配消除)将不起作用。
其他功能,如can_generate_method_entry_events
,can_generate_field_access_events
等can_pop_frame
,在解释器中添加额外的检查。
请注意,仅 jdwp 代理的存在就意味着上述开销,即使调试会话未处于活动状态。性能开销通常可以忽略不计,但有时缺少逃逸分析会增加分配压力并使应用程序减慢 5-10%。
此外,具有太多类的应用程序可能会受到jdwp
代理的严重影响。有时应用程序甚至可能会挂起,就像在这个问题中一样。有关详细信息,请参阅错误JDK-8227269。
即使没有附加调试器,代理也会处理类加载/卸载事件,因此同样,只有代理的存在可能已经导致问题。
简而言之,我不建议在生产环境中启用调试模式。虽然它通常工作得很好,但我多次看到与 jdwp 相关的问题,包括性能开销、冻结和本机内存泄漏。
推荐阅读
- bitbucket - 如何将 bc 添加到 bitbucket CI?
- c# - 如何使用 SqlDataReader 获取 Sum 结果
- javascript - 清除间隔 + 消息并替换为链接
- kubernetes - Minikube VM 驱动程序:无 vs Virtualbox/KVM
- java - 使用来自不同类的对象将数组转换为字符串
- android - 在远程服务器上运行/控制模拟器
- pandas - 如何添加新列(而不是替换)
- azure - 如何更新 Cosmos DB 文档分区键元素?
- c++ - 如何在 Windows C++ 上检测滚轮向下?
- java - 以“自然顺序”从数组中返回数据