java - 为什么方法断点会对性能产生如此负面的影响?

标签 java debugging jvm

为什么添加方法级断点会对 Debug模式下的程序性能产生如此负面的影响?

以下面的(有点做作的)例子为例:

public static void main(String[] args) {
    long start = System.currentTimeMillis();
    for(int a = 0; a <Integer.MAX_VALUE; a++) {
        long v = a * a;
        if(v == 100) {
            doSomething();
        }
    }
    System.out.println("Time: " + (System.currentTimeMillis() - start) + " ms");
}

private static void doSomething() {          //*** BREAKPOINT 2
    System.out.println("done something");    //*** BREAKPOINT 1
}

这个的性能大概是:

  • 未调试:4.5 秒
  • 调试,断点 1:6.0 秒
  • 调试,断点 2:47.0 秒

这是怎么回事?方法级调试给我们带来了哪些普通方法无法提供的好处?

谢谢!

编辑

时间只是近似值,包括我对断点使用react并继续应用程序所需的时间(看起来大约 1 秒左右)。

我很欣赏 System.currentTimeMillis() 不是 100% 准确,但结果在多次测试中是一致的,并且性能差异很大!事实上,添加方法级断点会导致 IntelliJ 发出警告,指出它会对性能产生影响。

最佳答案

最近我做了一个关于方法断点缓慢问题的研究。 我的结论是,根本问题是方法断点是通过使用 JDPA 方法进入和方法退出功能实现的。此实现要求 JVM 在每次任何线程进入任何方法以及任何线程退出任何方法时触发一个事件。

click here to read the entire article

关于java - 为什么方法断点会对性能产生如此负面的影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23652994/

相关文章:

java - 数组 - 输出必须是一年中的月份

objective-c - valgrind 和 iOS SDK 4.2?

java - 带 Tomcat 的 Eclipse $$EnhancerByCGLIB$$ 'Unable to install breakpoint'

java - 如何以编程方式获取特定 JVM 实例的系统属性?

garbage-collection - 当 JVM 无法到达安全点时如何获取 Java 堆栈

java - 如何修复 java.lang.UnsupportedClassVersionError : Unsupported major. 次要版本

java - 在 JCalendar 中禁用过去的日期和 2 周后的日期

java - spring boot 依赖注入(inject)

java - 如何检测一个 Java 类是被它自己的 main() 调用还是被另一个类调用?

iphone - 文本装饰 CSS 在 iPad/iPhone 的 Safari 上被覆盖