java - 如何内联抛出异常的方法?

标签 java performance exception exception-handling

我很好奇 Java JVM 有时如何内联有可能抛出异常的方法。我假设至少可以内联一些这样的方法(例如那些具有数组访问权限并因此有可能抛出 ArrayIndexOutOfBoundsException 的方法)。我看到的问题是,如果确实发生了异常,那么如果您已经内联该方法,您如何显示正确的堆栈跟踪?既然可以在不同的机器上内联不同的方法,内联如何不破坏堆栈跟踪机制?

最佳答案

您设想的问题是什么?由于是 JVM 本身进行内联,因此没有什么可以阻止它记住它在何处内联的内容,并在构造堆栈跟踪以安装到 Throwable 对象中时对此进行更正。

当构造抛出异常时,JVM 将遍历 CPU 堆栈并确定每个机器堆栈帧是否对应于解释的字节码、JIT 代码、库中的 native 代码等。为此,它引用了一些表,这些表告诉机器代码中的哪些地址对应于字节码中的哪些指令(如果类文件中存在该信息,则进一步返回源代码行)。这张表可以很好的说明JITted代码中的某个地方可以对应多个Java级别的栈帧。

但是,不需要 JVM 来执行此操作。它也可以选择简单地构建其中带有神秘中断的堆栈跟踪。查看javadoc for Throwable.getStackTrace() . (甚至不要求 JVM 完全能够生成堆栈跟踪)。

关于java - 如何内联抛出异常的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7218575/

相关文章:

java - 陷入 Spring 性能问题

java - 使用自定义堆栈跟踪的 Mockito.doThrow

ASP.NET 应用程序针对 NHibernate 抛出 "unable to find assembly"错误

Java - 在静态函数中构造泛型类的多个对象

java - 正则表达式在字符串数组中搜索

java - 无法在 log4j2 中使用 RollingFileAppender 写入日志

c# - ServiceStack:RestService 中的异常未记录在 catch 子句中

java - 更新滚动 Pane 的模型不会更新窗口

Python 瓶颈;确定文件比较功能的最佳 block 大小

c++ - 我应该优化还是让编译器这样做?