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

Gra*_*ity 11 java performance exception-handling exception

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

Hen*_*olm 10

你设想的问题是什么?由于它是JVM本身进行内联,因此当它构造一个堆栈跟踪以安装在Throwable对象中时,没有任何东西可以阻止它记住它在哪里内联并纠正它.

抛出构造的异常时,JVM将遍历CPU堆栈并确定每个机器堆栈帧是否对应于解释的字节码,JITted代码,来自库的本机代码等等.为此,它指的是表示机器代码中哪些地址对应于字节码中的哪些指令(以及进一步返回源行,如果该类信息存在于类文件中)的表.该表可以很好地指定JITted代码中的某个位置可以对应多个Java级别的堆栈帧.

但是,JVM 不需要执行此操作.它也可以简单地选择构造具有神秘中断的堆栈轨迹.请参阅Throwable.getStackTrace()javadoc.(甚至有不要求一个JVM能够产生堆栈跟踪所有).