内存中异常的Java大小

Bog*_* T. 12 java memory exception nullpointerexception

有没有人知道Exception在创建和抛出后会占用多少内存?

例如,NullPointerException.

以及垃圾收集的例外情况如何?

Bri*_*ach 4

有谁知道异常一旦创建并抛出会占用多少内存?

这完全取决于例外情况。与任何其他对象一样,它包含可变数量的数据;String如果有人做了一些愚蠢的事情,消息可能会是 4MB :

Exception e = 
    new Exception(new String("Some gigantic message ... lalalalalalalalla"));
Run Code Online (Sandbox Code Playgroud)

编辑:好的,这有点误导;异常包含对 a 的引用,String并且引用值是固定大小,但其String本身可能仅由异常引用 - 我将其更改为非文字以明确显示它可以是可收集的东西。自定义异常可以容纳任何东西,它是一个像任何其他对象一样的对象。此外,它取决于它被抛出的距离,因为它在其中保存了堆栈跟踪。这里有一个很好的Q/A on SO;在java中,确定覆盖此的对象大小的最佳方法是什么。)

异常是如何被垃圾收集的?

就像任何其他物体一样。异常被抛出到调用堆栈中,并且发生以下两种情况之一:

1) 你捕获它,并将其分配给 catch 块中的变量:

catch (Exception e) {
Run Code Online (Sandbox Code Playgroud)

e现在拥有对异常的唯一引用。当不再存在对它的引用时(即它超出了 catch 块底部的范围,或者您传递给它的对象被收集等),它将被收集。

2)你没有捕获它,它到达当前线程的调用堆栈的顶部。此时异常超出了范围,因此它将被收集,并且线程当然会停止。

** 说得完全迂腐一点,当我说“将被收集”时,我的意思是最终当 Java 中的对象不再有对其的引用时,它就有资格被收集,并且 GC 会处理它。