Javaexception与C ++exception
存储例外的地方? 堆栈,堆。 如何为例外分配和取消分配内存? 现在,如果您有多个需要处理的exception,是否创建了所有这些exception的对象?
我假设exception的内存分配方式与所有其他对象(在堆上)的分配方式相同。
这曾经是一个问题,因为那时你不能为OutOfMemoryError分配内存,这就是为什么在Java 1.6之前没有堆栈跟踪的原因。 现在他们也为堆栈跟踪预先分配空间。
如果您想知道在抛出exception时对exception的引用存储在何处,JVM会在内部保留引用,同时解除调用堆栈以找到exception处理程序,然后exception处理程序获取引用(在其堆栈框架上,就像任何引用一样)其他局部变量)。
不能同时抛出两个exception(在同一个线程上)。 它们可以嵌套,但是只有一个“活动”exception,并且引用了嵌套exception。
当对exception的所有引用都消失时(例如,在exception处理程序完成之后),exception会像其他所有内容一样被垃圾收集。
对于C ++,它没有定义存储exception的位置,但大多数编译器使用特殊的堆栈。 对于以前有人写过的Java,它们存储在堆上。
由于exception是C ++和Java中的对象,因此它们被分配并释放为特定语言中的对象。
两种语言中每个线程始终只有一个活动exception。
有关exception的最完整信息,我们可以直接访问源: 第11章: Java语言规范的 例外 ,第二版 。
例外确实是对象。 它们是Throwable
的子类:
每个exception都由Throwable类或其子类之一的实例表示; 这样的对象可用于将信息从发生exception的点传送到捕获它的处理程序。
因此,可能安全地假设,与Java中的任何其他Object
,它将在堆上分配。
就拥有多个Exception
对象而言,可能情况并非如此,因为一旦发生exception,Java虚拟机将开始寻找exception处理程序。
在抛出exception的过程中,Java虚拟机一个接一个地突然完成在当前线程中已经开始但未完成执行的任何表达式,语句,方法和构造函数调用,初始化程序和字段初始化表达式。 此过程将继续,直到找到一个处理程序,指示它通过命名exception的类或exception类的超类来处理该特定exception。
有关如何在运行时处理exception的更多信息, 第11.3节“exception处理”具有详细信息。
Java中的exception是对象,因此它们存储在堆上。
抛出exception时,JVM会在代码中查找匹配的exception处理程序。 即使存在多种可能引发的exception,这也适用。
存储例外的地方? 堆栈,堆。 如何为例外分配和取消分配内存?
在这方面,例外是与其他任何对象相同的对象。 通过new
分配在堆上,由垃圾收集器解除分配。
现在,如果您有多个需要处理的exception,是否创建了所有这些exception的对象?
不确定你的意思。 它们是通过new
,一次一个创建的。 当你使用exception链接时,可能会有不止一个 – 实际上并没有什么能阻止你创建成千上万的exception并将它们放在某个地方的List中 – 它只是没有多大意义。
在Java中,Exception扩展了Throwable,它扩展了Object。 即从记忆的角度来看,它就像任何其他物体一样。
在Java 7中已经建议局部变量可以使用转义分析放置在堆栈上以找到堆栈变量的候选者。 但是,exception通常从方法抛出到调用者(或其调用者等),因此将exception放在堆栈上会非常有用。