为什么Java代码在调试器中会变慢?

为什么Java代码在调试器中会变慢?,java,debugging,jboss,intellij-idea,Java,Debugging,Jboss,Intellij Idea,当通过调试器运行时,某些CPU密集型例程的速度会显著降低。为什么会这样 目前,我只是使用IntelliJ逐步完成JBoss中运行的代码。启动JBoss时,我使用以下选项: set JAVA_OPTS=-Xms512m -Xmx1024m -XX:MaxPermSize=256m -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n %JAVA_OPTS% 有没有办法加快执行速度?或者加速某些我不需要单步执行的

当通过调试器运行时,某些CPU密集型例程的速度会显著降低。为什么会这样

目前,我只是使用IntelliJ逐步完成JBoss中运行的代码。启动JBoss时,我使用以下选项:

set JAVA_OPTS=-Xms512m -Xmx1024m -XX:MaxPermSize=256m -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n %JAVA_OPTS%
有没有办法加快执行速度?或者加速某些我不需要单步执行的方法


更新:似乎如果我没有跨过/进入CPU密集型例程(即:只运行直到在例程后面设置断点),那么执行时间就好像不在调试器中一样

当通过调试器运行时,某些CPU密集型例程的速度会显著降低。为什么会这样


因为在启用调试时,抖动不会对代码进行太多优化(通常,根本不会)。它还取决于“断点样式”。例如,在变量上设置观察点或在接口级别设置断点(调试器在执行所有方法实现时都会停止)通常会显著降低处理时间。

调试时,除了运行应用程序外,还运行调试器

代码是在调试模式下编译的,带有关于局部变量和其他源代码级信息的元数据符号。调试器读取以了解哪一行源代码与当前指令相对应。该过程称为符号调试。存储的符号会增加代码大小,而解释它们会增加执行时间

一些调试器实际上会动态地解释代码,这几乎总是对性能造成重大影响

有关Java调试编译模式的更多信息,该模式由
javac
执行,在类文件中包含调试信息。 例如:
-g
生成所有调试信息,包括局部变量。

顶部提示:在IDEA中,您可以使用ALT+F9运行到光标所在的位置,而不是设置额外的断点

我发现了一个有趣的现象,如果你在代码中穿行,有大量的数据可以从堆栈中访问,那么调试在思想上会变得非常缓慢。别忘了,IDEA会收集这些数据(当前在词法范围内的任何数据),并将其作为对象树呈现给您,以浏览您是否在“观看”,并在随后的每个步骤中执行此操作(可能每次都会重新创建树?)


<>这是特别明显的,例如,有一个大的集合作为“当前”对象的实例变量。

你需要考虑另一个程序——调试器——被钩住到你的程序中,并像异常一样观察它。它还监视当前线路,以便对断点或用户请求的中断(如暂停请求或监视条件)作出反应

调试JIT产生的优化代码将非常困难,因为一系列本机指令和一行Java代码之间没有直接关系,就像一系列Java字节码和一行Java代码之间没有直接关系一样

因此,在调试器中分解函数会迫使JVM对您正在执行的方法进行去优化。Hotspot根本不生成本机代码,只解释方法的字节码


在JDK 1.4.1之前,启用调试将强制JVM仅使用解释器:

如果使用Java 5,则调试参数为:

-agentlib:jdwp=transport=dt_套接字,服务器=y,挂起=n,地址=

在Java5之前


-Xdebug-Xrunjdwp:transport=dt_套接字,地址=5005,服务器=y,挂起=n

谢谢。你能详细说明一下这个优化过程吗?大多数虚拟机不读取字节码,执行等效的指令,然后重复。那太慢了。他们所做的是将字节码作为一个整体,将其转换为等效的本机代码,然后执行本机代码。如果您在调试器下运行(因此说您可能会在某个时候跳过调试器),那么您对实际可以执行的操作设置了一些非常严格的限制。+1因为这种情况从未发生在我身上(连接到db的速度较慢),当您说代码是在调试模式下编译时,最有可能的情况是,您指的是JVM将Java字节码编译为本机机器码?非常感谢。我正在浪费大量的时间,因为我不知道为什么,我在一个进程上的远程调试会话在许多次迭代中都表现良好,但它开始持续缓慢地运行。在读到这篇文章之前,我从未想过它可能会受到我设置的断点的影响(不是断点命中,而是设置的断点)。禁用我的所有断点并重新启用更有选择性地排序问题。似乎断点的数量本身就是一个因素。我尝试了一点启用/禁用。在我当前的环境中,只要启用了>39个断点,整个过程(从启动开始)就会变得非常缓慢。不管是哪一篇,不要因为你的第一篇帖子被否决而生气。它只是没有回答这个问题。