为什么在使用方法条目调试时,调试的程序速度会减慢这么多?

2022-09-01 08:51:22

我正在使用jdi接口来创建调试器,当我使用MethodEntryRequests启用方法输入跟踪时,调试的程序速度会减慢几十倍。我已经将主线程的过滤器和挂起策略设置为SUSPEND_EVENT_THREAD。Classfilter是有限的,如果我打印任何收到的事件,它不会显示超过几十个,所以它不应该收到太多的事件。我正在本地调试,并使用调试的java程序遵循某种命令行:

-Xdebug -Xrunjdwp:transport=dt_socket,suspend=y,server=y,address=1337


答案 1

简短的答案是,当设置方法条目时,执行将通过解释器运行。我不认为这周围有...

过去,在调试模式下运行的所有代码都是这种情况,但在 1.4...现在,HotSpot适用于“全速”调试,除非在方法条目和退出,观察点以及单步执行或包含断点的方法中。


答案 2

2个理由:

  1. 它必须在每个方法条目上添加检查(没有选项可以只调整某些方法)
  2. 方法内联变得不可能(因此小方法的运行速度慢了10-100倍)

探查器和 .net 应用也是如此