2014-11-23 88 views
4

我知道JVM有一个异常表,它映射可以在给定字节码索引中抛出的可能异常。我也读过Athrow字节码,它抛出了堆栈顶部存在的引用类型。我的问题更多地涉及irem如何“抛出”例外的指示。JVM如何“抛出”异常

在每次执行指令后,JVM是否检查堆栈的顶部以检查是否有异常?希望对此有所洞察。

回答

2

irem是“逻辑int余数”运算符。 Java虚拟机规范writes

运行时异常

如果除数的一个int余运算符的值是0,irem抛出ArithmeticException

JVM实现如何完成未指定的操作。它可以指示CPU在执行除法之前将除数与零进行比较,或者执行除法运算,然后对所讨论的CPU发出信号表示除数为0。由于零部分可能很少,后一种策略可能更有效。

例如,Intel 64 and IA-32 architectures software developer's manual combined volumes 3A, 3B, and 3C: System programming guide写道:

6.1中断和异常概述当处理器在执行指令时,如被零除检测到错误情况发生

例外。处理器检测各种错误情况,包括保护违规,页面错误和内部机器故障。 Pentium 4,Intel Xeon,P6系列和Pentium处理器 的机器检查体系结构还允许在检测到内部硬件错误和总线错误时生成机器检查异常。

当收到中断或检测到异常时,当处理器执行中断或异常时,当前正在运行的过程或任务暂停。处理程序的执行完成后,处理器继续执行中断的程序或任务。中断程序或 任务的恢复不失程序连续性,除非不能从异常中恢复或中断导致当前正在运行的程序终止。因此

的JVM将定义的异常处理程序以创建一个异常对象,保留在一个公知的寄存器对它的引用,并且然后执行用于athrow字节代码指令。

+0

这回答了我的想法。谢谢。后续问题,所以有2个中断处理程序是正确的? CPU执行的一个和JVM根据异常表跳转执行的一个? – karmanaut 2014-11-23 16:21:23

+0

抛出JVM异常的硬件异常的处理程序,以及catch或finally块将控制权交给?是的,我希望这些是独立的代码块。 – meriton 2014-11-23 20:14:33