当我声明int a = 0;
因为它是值类型时它会从堆栈获取内存,所以当这个变量超出范围时,垃圾收集器会回收这个内存吗?
答案 0 :(得分:16)
当我声明int a = 0时;因为它是值类型,它从堆栈中获取内存
这是正确的 - 假设局部变量是短暂的 - 但逻辑是错误的。当您声明任何短暂的本地时,它从短期内存池获取其内存,可能是堆栈,或者它可能是寄存器。它从短期池中获取内存,无论它是值类型还是引用类型的引用。无论哪种方式,如果变量是短暂的,则在短期池上分配内存。
也就是说,当你有一个短暂的本地
object x = null;
对象的引用的存储空间在短期池中分配。所引用对象的存储(如果有)在长期池(堆)上分配。在这种情况下,引用为空。
当这个变量超出范围时,垃圾收集器会回收这个内存吗?
没有。 垃圾收集器仅收集在长期池(也称为堆)上分配的内存。
垃圾收集者当然必须了解短期池;如果短期池中有引用,那么这些引用可能是存活的东西。但垃圾收集器可以安全地忽略短期池中不包含引用的所有值类型。
你为什么问这个问题?我怀疑这里存在一个更深层次的问题。