垃圾收集器回收值类型内存



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

当我声明int a=0时;由于是值类型,它从堆栈中获取内存

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

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

object x = null;

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

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

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

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

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

最新更新