open中的本机方法fillInStackTrace发出一个调用JVM_FillInStackTrace(env,throwable)是该方法的来源。
抛出是jvm指令athrow。与程序集Jvm本身类似的东西是本机代码,所以在jvm中实现的任何东西都是本机too.So,是抛出本机吗?换句话说,对fillInStackTrace的内部调用不会导致通常的JNI调用?(而成本是填充堆栈跟踪)。
是试图捕获缓存的异常,保证工作的?异常表将如何是filled.For,相同的异常,会有多个匹配的catch块吗?
在web应用程序(或具有类似延迟的任何应用程序)中真的很昂贵吗?说,web服务get/employee/{invalid_id}抛出javax.ws.rs NotFoundException,而不是使用if/javax.ws.rs返回一个404响应。考虑到http请求、响应和object序列化/反序列化的成本,异常的成本并不高。
发布于 2015-06-23 03:58:25
创建异常对象时,需要捕获堆栈跟踪。JVM通过遍历java堆栈来查找调用链中的所有方法,从而达到这个目的。
当调用方法时,fillInStackTrace方法的成本与java堆栈的深度成正比。与此成本相比,JNI相对于内部开销更低。
异常捕获独立于使用缓存的异常或新创建的异常。在执行athrow字节码时,JVM遍历java堆栈,并寻找能够处理当前异常类型的catch块的方法。
异常是针对异常事件的,不应用于控制流。
发布于 2015-06-23 05:00:54
在实践中,异常用于非本地控制流。例如,jruby和scala (可能还有其他基于JVM的语言)使用它们来中断函数循环体或从闭包返回外部函数。
但是,它们使用的优化不填充堆栈跟踪和/或使用预先分配的异常,JVM将这些异常优化为goto (如果可以内联的话)。但这些都是没有其他选择的专门案例。
在一般情况下,异常只能用来表示异常行为。
例外仍然可以意味着预期,但不常见的情况下,可以认为是一个缓慢的代码路径,其中异常恢复是如此昂贵,无论如何,产生异常是一个微不足道的代价相比。各种与网络相关的异常将是一个例子,因为网络从来都不是100%可靠的,但是错误也不会主导大部分操作。
https://stackoverflow.com/questions/30989519
复制相似问题