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

Mar*_*eon 20 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%
Run Code Online (Sandbox Code Playgroud)

有没有办法加快执行速度?或者加速我不需要介入的某些方法执行?


更新:似乎我没有跨越/进入CPU密集型例程(即:只运行直到例程之后设置的断点),然后执行时间就好像不在调试器中.

Ano*_*on. 42

通过调试器运行时,一些CPU密集型例程会显着变慢.为什么是这样?

因为启用调试时,JITter不会优化代码(通常,根本不会).

  • 大多数虚拟机不读取字节码,执行等效指令,然后重复.那太慢了.他们反而做的是将字节码作为一个整体,将其转换为等效的本机代码,然后执行本机代码.如果你在一个调试器下运行(因此说你可能会在某个时候跳过它),你就会对实际可以做的事情施加一些非常大的限制. (13认同)

man*_*ana 7

它还取决于"断点式".例如,在变量上设置观察点或在接口级别上设置断点(调试器将在执行时停止在所有方法实现上),这通常会大大减慢处理时间.

  • 非常感谢你.我正在失去大量的时间,因为,并且无法弄清楚为什么,我在多次迭代中表现良好的进程上的远程调试会话开始一直运行缓慢.直到我读到它之前我才想到它可能会受到我设置的断点的影响(不是断点,而是设置).禁用所有断点并重新启用更有选择性地排序问题. (3认同)

Abb*_*boq 5

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

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

有些调试器实际上会动态解释代码,这几乎总是一个主要的性能损失.

有关Java的调试编译模式的更多信息,该模式由类文件执行javac并包含调试信息:Java语言编译器选项.例如:-g生成所有调试信息,包括局部变量.