无掷虚拟机器错误保证

2022-09-03 14:11:42

我从C++来到Java。在C++世界中,我们关注异常安全,并注意到在面对突变体本身或其委托给的方法(最小值,强,无丢弃)引发的异常时,突变体可以提供不同的保证。实现具有强异常保证的方法需要保证某些基本操作永远不会引发异常。JLS 会声明哪些操作可以引发哪些类型的异常,但该错误会带来问题。引用JLSVirtualMachineError

内部错误或资源限制阻止Java虚拟机实现Java编程语言的语义;在这种情况下,将抛出 的子类的实例。VirtualMachineError

JLS不再说关于.“内部错误”意味着JVM中的错误,所以我对这种情况不感兴趣:面对JVM中的错误,所有的赌注都关闭了。但是,“资源限制”的情况呢?是否有任何操作可以保证永远不会因资源限制而失败?VirtualMachineError


答案 1

引用 Java 虚拟机规范

此规范无法预测在何处可能遇到内部错误或资源限制,也无法准确规定何时可以报告这些错误或资源限制。因此,在 Java 虚拟机的操作过程中,可以随时抛出下面定义的任何子类:VirtualMachineError

因此,在Java中,对于VirtualMachineError异常,不能做出异常保证。所有例外保证必须遵守“...但如果抛出 a,则不然”。这是Java与C++不同之处之一。VirtualMachineError

这也表明捕获异常没有多大意义,因为如果抛出异常,则程序处于未定义状态。不幸的是,这包括例外情况。不幸的是,因为如果一个程序有几个独立的任务要执行(例如,一个Web服务器),如果一个任务因为需要太多内存而失败,我们可能希望继续执行其他任务。VirtualMachineErrorOutOfMemoryError


答案 2

如果是资源限制,首先,不会进行任何操作。这是具有VirtualMachineError的完美示例的链接。虚拟机错误

此错误与 OutofMemoryError 不同,此时某些操作可能正在进行中。