我在这里看到预分配的JVM异常引用:
- http://www.oracle.com/technetwork/java/javase/relnotes-139183.html
- http://dev.clojure.org/display/community/Project+Ideas+2016
但是在寻找时,我只看到了有关缺少堆栈跟踪的信息。
JVM分配的异常是什么?这似乎是一种优化。
它是如何工作的,有哪些权衡考虑?
它是如何工作的,有哪些权衡考虑?
throw new ...
抛出。NullPointerException
ArithmeticException
ArrayIndexOutOfBoundsException
ArrayStoreException
ClassCastException
这个理念非常简单:抛出异常中最昂贵的部分不是实际的抛出和堆栈展开,而是在异常中创建堆栈跟踪(通过Throwable#fillInStackTrace
在异常构造函数中相对缓慢地调用VM)。要找到具体的数字和相关成本,您可以阅读Hotspot性能工程师关于exceptional performance的精彩文章。
有些人将异常用于常规控制流程(请不要这样做)或者出于性能考虑(通常是不正确的,例如参见this这种比较流行的连接池框架),因此Hotspot通过抛出已经创建好的没有堆栈跟踪的异常(从而消除了抛出异常中最昂贵的部分)来使这段[可能糟糕的]代码稍微快一点。
这种方法的缺点是,现在你有了没有堆栈跟踪的异常。这并不是什么大问题:如果这些隐式异常经常被抛出,那么你可能不需要它们的堆栈跟踪。但如果这个假设是错误的,你的日志中就会出现没有跟踪的异常。为了防止这种情况发生,你可以使用-XX:-OmitStackTraceInFastThrow
。-XX:-OmitStackTraceInFastThrow
来取消此功能。