3

当我声明int a = 0;它是值类型时,它会从堆栈中获取内存,所以当这个变量超出范围时,垃圾收集器会回收这个内存吗?

4

1 回答 1

16

当我声明 int a = 0; 因为它是值类型,所以它从堆栈中获取内存

这是正确的——假设局部变量是短暂的——但逻辑是错误的。当您声明任何短期本地时,它会从短期内存池中获取内存,这可能是堆栈,也可能是寄存器。它从短期池中获取内存,无论它是值类型还是对引用类型对象的引用。无论哪种方式,如果变量是短期的,则内存将分配在短期池中。

也就是说,当你有一个短暂的本地

object x = null;

对象引用的存储分配在短期池上。被引用对象的存储(如果有的话)分配在长期池(堆)上。在这种情况下,引用为空。

当这个变量超出范围时,垃圾收集器会回收这个内存吗?

不会。垃圾收集器只收集在长期池(也称为堆)上分配的内存。

垃圾收集器当然必须知道短期池;如果短期池中有引用,那么这些引用可能是对活着的事物。但是垃圾收集器可以安全地忽略所有不包含在短期池中的引用的值类型。

你为什么问这个问题?我怀疑这里隐藏了一个更深层次的问题。

于 2012-04-05T13:53:41.697 回答