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

6kkfgxo0  于 2023-02-28  发布在  Java
关注(0)|答案(8)|浏览(208)

一些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密集型例程(即:只要运行到例程之后设置的断点),那么执行时间就好像不在调试器中一样。

lb3vh1jj

lb3vh1jj1#

一些CPU密集型例程在调试器中运行时会明显变慢,这是为什么呢?
因为在启用调试时,JITter不会对代码进行太多优化(通常,根本不会)。

voj3qocg

voj3qocg2#

它还取决于“断点风格”。例如,在变量上设置观察点或在接口级别设置断点(调试器将在所有方法实现执行时停止)通常会显著降低处理时间。

p8ekf7hl

p8ekf7hl3#

调试时,除了运行应用程序外,您还在运行调试器。
代码在调试模式下编译,其中包含有关局部变量和其他源代码级信息的元数据符号。调试器进行读取以了解源代码的哪一行与当前指令相对应。此过程称为符号调试。存储的符号会增加代码大小,而解释这些符号会增加执行时间。
有些调试器实际上是动态地解释代码,这几乎总是一个主要的性能影响。
有关Java调试编译模式的更多信息,该模式由javac执行,包括类文件中的调试信息:Java语言编译器选项。例如:-g生成所有调试信息,包括局部变量。

qltillow

qltillow4#

你确实需要考虑到另一个程序--调试器--被“钩住”到你的程序中,并且监视着它,比如异常,它还监视着当前行,以便对断点或用户请求的中断(比如暂停请求或监视条件)做出React。

k10s72fa

k10s72fa5#

顶部提示:* 在IDEA中,您可以使用ALT+F9运行到光标所在的位置,而不是设置额外的断点。*
我发现,如果你正在遍历有大量数据可以从堆栈访问的代码,那么在IDEA中调试会变得非常慢。IDEA收集这些数据(词法作用域中当前的任何内容),并将其作为对象树呈现给您,以便您浏览是否正在“监视”,并在每个后续步骤中执行此操作(也许它每次都重新创建树?)。
例如,当有一个大型集合作为“当前”对象的示例变量时,这一点尤其明显。

nhn9ugyo

nhn9ugyo6#

调试JIT生成的优化代码将非常困难,因为在一系列本机指令和一行Java代码之间不存在直接关系,就像在一系列Java字节码和一行Java代码之间存在关系一样。
因此,在调试器中闯入函数会强制JVM去优化您正在单步执行的方法。Hotspot根本不会生成本机代码,而只是解释方法的字节码。
在JDK 1.4.1之前,启用调试后会强制JVM仅使用解释器:http://java.sun.com/products/hotspot/docs/whitepaper/Java_Hotspot_v1.4.1/Java_HSpot_WP_v1.4.1_1002_3.html#full

rwqw0loc

rwqw0loc8#

如果使用Java 5,则用于调试的参数为:
-agentlib:jdwp=传输=dt_套接字,服务器=y,挂起=n,地址=
以及Java 5之前
-Xdebug -Xrunjdwp:传输=dt_套接字,地址=5005,服务器=y,挂起=n

相关问题