【发布时间】:2015-04-06 05:41:28
【问题描述】:
我尝试了一个简单的实验来验证垃圾收集器的功能。参考 3.9 Automatic memory management (MSDN) 关于.NET 中的自动内存管理。对我来说,这听起来像是 C++ 中的共享指针等价物。如果一个对象的引用计数器变为零,它将被垃圾收集器释放。
所以我尝试在我的主窗体中创建一个函数。该函数是在我的主窗体的 Shown 事件函数中调用的,该函数在构造函数之后执行。这是实验代码。
public void experiment()
{
int[] a = new int[100000];
int[] b = new int[100000];
int[] c = new int[100000];
int[] d = new int[100000];
a = null;
b = null;
c = null;
d = null;
}
结果如下:
内存分配前
内存分配后
离开函数作用域之前
离开函数作用域后
为什么数组a、b、c、d分配的内存被设置为null后,垃圾回收器没有释放?
【问题讨论】:
-
您不能指望在设置 null 后立即发生垃圾回收。当然,您可以通过调用
GC.Collect来强制执行它以查看差异。 -
如果您需要确定性内存释放,那么您使用了错误的语言。
-
一般情况下,不要试图理解垃圾回收,也不要乱搞。
-
仅供参考,您使用了错误的工具;在任务管理器中查看总分配几乎不会告诉您 .NET 如何管理内存。如果您有兴趣了解垃圾收集器的工作原理,请使用 .NET 内存分析器。这就是它的用途。
-
为什么这个问题会受到如此多的关注?非确定性是关于 .NET GC 的第一件事。这一定是第 1000 个这样的问题。
标签: c# .net memory-management garbage-collection