2014-11-23 136 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