Java 为什么启用某些异常的调试要慢得多?

Java 为什么启用某些异常的调试要慢得多?,java,scala,debugging,intellij-idea,jvm,Java,Scala,Debugging,Intellij Idea,Jvm,考虑以下代码: public class JMain { private final static int forLength = 6; private static void returnFromFor(int breakAt) { try { for (int j = 0; j < forLength; j++) { if (j == breakAt) {

考虑以下代码:

public class JMain {
    private final static int forLength = 6;

    private static void returnFromFor(int breakAt) {
        try {
            for (int j = 0; j < forLength; j++) {
                if (j == breakAt) {
                    throw new Throwable("break");
                }
            }
        } catch (Throwable ignored) {
        }
    }

    public static void main(String args[]) {
        long start = System.currentTimeMillis();
        int iterations = 100000;
        for (int i = 0; i < iterations; i++) {
            returnFromFor(i % forLength);
        }

        long end = System.currentTimeMillis();
        System.out.println(((Long) (end - start)).toString() + " ms");
    }
}

IDEA在加载目标异常类之前不会设置异常断点

在程序的生命周期中,从不加载UnsupportedOperationException。这就是为什么程序运行速度和没有断点时一样快


IllegalArgumentException是一个更流行的类,它在JVM启动期间加载在JDK类库中的某个地方。在这种情况下,确实设置了异常断点,以便调试器接收有关程序中抛出的所有异常的通知。

如果使用调试器simple print hello world,它是否仍然很慢?如果是这样,你的操作系统是什么?@snr这是Winx64-在问题中添加了系统配置。至于简单的printf演示,恐怕我不明白。除非启用异常断点,否则没有性能差异。当我启用它们时,当没有抛出异常时没有区别。不,我的意思是当您启用断点simple System.out.PrintLTest;时;。调试器仍然很慢吗?启用代码断点对性能没有任何影响。它只启用了一些异常断点。我认为这完美地解释了我所看到的一切。我仍然很好奇——是否有可能让我相信IllegalArgumentException确实加载了,而另一个没有加载?我曾尝试在IllegalArgumentException的所有构造函数上放置断点,但它们没有触发。我想加载一个类而不在其上执行构造函数是可能的。这能被检测到吗?或者该类甚至在调试器连接到进程之前就已加载?我确认在程序早期使用throw new java.lang.UnsupportedOperationException会使性能下降,正如您在启用相应异常断点时所预测的那样。@Suma Run java-verbose:class。加载一个类而不创建它的任何实例是完全可能的。@apangig我做到了。令我惊讶的是,IllegalArgumentException和UnsupportdOperationException都是在应用程序初始化期间列出的,这是我无法理解的。
object Main extends App {

  val forLength = 6
  def returnFromFor(breakAt: Int): Unit = {
    for (j <- 0 until forLength) {
      if (j == breakAt) return
    }
  }

  val start = System.currentTimeMillis()
  val iterations = 100000
  for (i <- 0 until iterations) {
    returnFromFor(i%forLength)
  }
  val end = System.currentTimeMillis()
  println(s"Duration ${end-start} ms")

}