繁体   English   中英

Java异常内部

[英]Internals of Java Exceptions

open-jdk中的本机方法fillInStackTrace调用JVM_FillInStackTrace(env,throwable)是否未提供此方法的源代码?

罚球是JVM指令athrow。 类似的事情在装配JVM本身跳是本机代码,以便在JVM中执行什么是原生too.So是本土? 换句话说, 对fillInStackTrace的内部调用不会产生通常的JNI调用的成本吗? (并且成本是填充堆栈跟踪)

try-catch是否可以保证缓存异常工作 如何填充异常表。对于相同的异常,我将有多个匹配的catch块吗?

它们在Web应用程序(或具有类似延迟的任何应用程序)中是否真的很昂贵? 假设Web服务的get / employee / {invalid_id}抛出javax.ws.rs NotFoundException,而不是使用if / else返回404响应。 考虑到http请求,响应和对象Json序列化/反序列化的开销,异常的开销并不大。

创建异常对象时,需要捕获堆栈跟踪。 JVM通过遍历Java堆栈以找到导致这一点的调用链中的所有方法来完成此操作。

fillInStackTrace方法的成本与调用该方法时java堆栈的深度成正比。 与该成本相比,JNI与固有开销相比较低。

异常捕获与使用缓存的异常或新创建的异常无关。 当执行throw字节码时,JVM会遍历 java堆栈并寻找一种方法,该方法可以具有可以处理当前异常类型的catch块。

异常是针对异常事件的 ,不应该用于控制流。

在实践中的异常用于非本地控制流。 例如jruby和scala(可能还有其他基于JVM的语言)使用它们来中断功能循环体或从闭包返回外部函数。

但是他们使用的优化对象不会填充堆栈跟踪和/或使用预分配的异常,如果JVM可以内联它们,JVM会将其优化为goto。 但是这些是特殊情况,没有其他选择可用。

在一般情况下,异常仅应用于表示异常行为。
在被认为是一条缓慢的代码路径的情况下, 异常仍然可以预料到但并不常见,在这种情况下,异常恢复的代价非常高,以至于生成异常的价格相对而言可以忽略不计。 各种与网络相关的异常都是一个例子,因为网络永远不会100%可靠,但是错误也不是操作的主要内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM