试捕法的成本
大致来说,
tryblock不会向结果程序集中添加任何异常检查代码。只要不引发异常,它基本上是无操作的。所有缓慢的工作都是通过异常引发代码完成的。
如果
try-catch是JIT编译的,则 除了 代码外,还会添加一个异常表。它将可能发生已处理异常的地址范围映射到相应异常处理程序的地址。
注意: 这些不是字节码索引,而是实际的内存地址。
HotSpot中如何引发异常?
- 隐式异常:
NullPointerException
和StackOverflowError
是在响应分段错误时在信号处理程序中检测到的。 ArrayIndexOutOfBoundsException
,ClassCastException
等等。相应的检查将内联到已完成数组访问的已编译代码中。OutOfMemoryError
只要执行线程状态转换(vm-> java或native-> java),就会显式检查从本机代码引发的所有其他异常。athrow
字节码引发的所有用户异常。在快速路径中(当catch
存在同一帧中的处理程序时),JIT编译athrow
为简单跳转。否则,将发生反优化,并在VM运行时内部完成异常处理。
好吧,“如何在程序集级别捕获异常?”
绝不。
我的意思是,通常不会在程序集级别捕获异常-所有繁重的工作(堆栈移动,处理程序查找,去优化,监视器解锁等)都在VM运行时(即C代码)中完成。



