将JVM设置为监听调试端口会产生额外开销吗?

5

我希望能够使用jdwp调试生产系统。 为此,我想要在启动每个Java进程时添加-Xdebug -Xrunjdwp:transport=dt_socket,address=11122,server=y,suspend=n
如果端口未激活,这样做会有任何开销吗?
在这种情况下,我的JVM会运行得更慢吗?


4
重复?https://dev59.com/8G865IYBdhLWcg3wnf9t,https://dev59.com/alPTa4cB1Zd3GeqPgytX - Eli Acherkan
2
我不建议直接调试生产系统。当您启动调试器时,会干扰JVM,并可能导致线程被挂起等问题,这可能会产生副作用。我更愿意为调试目的制作一个精确的系统副本。 - Thomas
@Thomas在这里提出了一个很好的观点(即使没有任何开销也适用)。如果确实需要,可以使用生产数据库,并小心谨慎,但为调试而预留一个额外的JVM(不处理“真实”请求)是更好的选择。 - Thilo
1
@Thilo 我宁愿复制生产数据库也不想意外更改一些数据。我知道有时即使您认为您拥有精确副本,找到错误可能会很困难 - 这可能并非总是正确的(某些服务器/操作系统设置可能不同) - 但通常值得尝试,因为生产系统不会中断或意外损坏。 - Thomas
@Thomas。同意。我说过“可能”和“小心”。不幸的是,有时候一些棘手的现实问题很难在测试环境中复制(我假设确实存在一个测试环境,首先被使用,我们现在谈论的是真正需要查看生产数据的罕见情况)。 - Thilo
显示剩余4条评论
3个回答

3
据我所知,答案是肯定的。-Xdebug会关闭一些运行时优化等功能。
此外,通过jwdp连接JVM并不是很安全。我认为任何生产环境都不应该允许这样做。

@Tarlog,通信记录在该端口上,因此这只是一个薄弱的尝试。此外,VPN授权是基于客户端证书(+标准防火墙)进行的,您没有它等等。内部攻击当然是最常见的,主要是因为安全性不够严格。除非明确说明:仅仅因为是VPN并不意味着任何人(包括您)都可以访问它! - bestsss
@bestsss:这样说吧:在生产环境中打开调试端口是一个巨大的弱点。它是否是漏洞取决于具体情况。因此,如果没有办法连接到特定服务器(包括内部,当根本没有VPN时),那么它可能不是漏洞。至少在获得这样的访问权限之前是这样的。我怀疑,如果有人对你的产品进行安全审查,它不会通过任何安全审查。 - Tarlog
@bestsss:此外,谈论安全并不仅意味着保持数据的完整性。可用性也是一个问题,而且很容易在调试器中阻塞所有线程,导致拒绝服务攻击。 - Tarlog
@Tarlog,在持有部分第一步,尝试使用jmap -dump; 您可以通过正常手段重新部署在服务器上表现出不良行为的应用程序。关键是:您需要访问该机器,VPN是提供访问的常规方式(再次强调std VPN依赖于客户端证书)。连接VPN后您所做的事情,如ssh或debug,完全是另一回事。Kill可以完全杀死服务器,因此debug也可能被利用,授权访问又是另一回事。Debug会创建不同的问题:泄漏!由于JNI根在调试期间。 - bestsss
@bestsss 调试授权会为 JVM 提供额外的访问权限。因此,这是一种安全漏洞。您可能无法访问服务器(没有凭据),因此无法运行 jmap,但仍然可以连接到调试。再次强调:我正在谈论内部访问,因此没有 VPN。 - Tarlog
显示剩余3条评论

2
如果您实际上没有使用远程调试器连接到此端口,则开销几乎为零(根据我的经验,我从未注意到过它)。

1

-Xdebug 在调试模式下使程序变慢约5%(Java 5,我没有Java 6的数据),因为它无法执行某些种类的优化。

套接字本身不会花费太多; 为其创建了一个线程,在 accept() 中挂起(因此在实际有人连接到端口之前不会产生任何开销)。


不,当调试连接时,JVM会取消优化,当同一CH(类层次结构)中加载新类时也是如此。如果有断点,则代码将被解释执行。 - bestsss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接