内存中异常的 Java 大小

标签 java exception memory nullpointerexception

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

例如,NullPointerException

以及异常是如何被垃圾回收的?

最佳答案

Does anyone know how much memory an Exception occupies once it is created and thrown?

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

Exception e = 
    new Exception(new String("Some gigantic message ... lalalalalalalalla"));

(编辑: 好的,这有点误导;异常包含对 String 的引用,并且引用值是固定大小,但 String 本身可能只被异常引用 - 我将其更改为非文字以明确显示它可能是可收集的东西。自定义异常可以包含任何东西,它是一个像任何其他对象一样的对象。此外,这取决于它被抛出了多远,因为它在其中保存了堆栈跟踪。SO 上有一个很好的 Q/A;In java, what is the best way to determine the size of an object 涵盖了这一点。)

And how exceptions are being garbage collected?

就像任何其他对象一样。异常被抛出调用堆栈并发生以下两种情况之一:

1) 你捕获它,它被分配给 catch block 中的一个变量:

catch (Exception e) {

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

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

** 当我说“将被收集”时完全迂腐,我的意思是最终因为当 Java 中的对象不再引用它时,它是 符合条件的收集,GC 处理它。

关于内存中异常的 Java 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21039959/

相关文章:

mysql - 带有内存数据库的 Rails

java - 循环和文件统计 Java 程序

java - XStream - 解码 - XML 中指定的类型不可见

c# - 正确使用断言和异常

c# - 如何使用 C# 处理 401 错误响应?

c++ - 准确计算 C++ 程序使用的内存

java - Unix 换行符

Java堆转储和堆分析后的堆大小不同

javascript - 如何检测 Worker API 中的无效 URL 错误

尝试通过内存中的地址调用函数时 C++ 程序崩溃(如何修复?)