我有一个程序,我在其中分配了一个int数组,并希望在调用GC.Collect()
后检查它是否会被垃圾回收。在这个程序中,我分配一个int数组array1
并保留一个WeakReference
,以便检查它是否在以后进行垃圾收集。我有一个名为procedure
的方法,它在其中分配一个新的本地数组(array2
),并将array2
分配给通过引用传递的输入temp
数组。此方法还会指定弱引用ref1
和ref2
来保存有关输入temp
数组和array2
的信息。当我调用此方法时,我将array1
传递给它,因此array1
等于array2
。退出方法后,我调用GC.Collect()
强制进行垃圾回收。调试器告诉ref1
,ref2
仍有IsAlive
属性等于true
。在ref3
函数和引用main
中实例化的array1
在垃圾回收后告诉IsAlive
属性为false
,因此array1
具有ref1
已被垃圾收集。
不应该array1
引用IsAlive
,false
属性等于ref3
,就像array1
一样(也引用static WeakReference ref1;
static WeakReference ref2;
static WeakReference ref3;
const int max_size = 10;
public static void procedure(ref int []temp)
{
int[] array2 = new int[max_size];
temp = array2;
for (int i = 0; i < max_size; i++)
array2[i] = i * 2;
ref1 = new WeakReference(temp);
ref2 = new WeakReference(array2);
}
static void Main(string[] args)
{
int []array1 = new int[max_size];
ref3 = new WeakReference(array1);
procedure(ref array1);
//array1 = null;
GC.Collect();
}
1}})吗?
{{1}}
答案 0 :(得分:2)
我认为您在变量和他们指向的值之间感到困惑。在您致电GC.Collect()
时,array1
,ref1
,ref2
都指向在过程()中创建的数组(array1
是唯一的强引用活的)。
手动跟踪代码,跟踪每个值(在procedure()中创建的数组,在Main()中创建的数组)以及每个点的哪个变量指向。
您将看到在procedure()中创建两个WeakReferences的点,temp和array2指向相同的值(在同一方法中创建的数组)。在Main()中创建的WeakReference将是唯一指向Main()中创建的数组的东西,因为array1
变量将被更改为指向另一个数组by procedure(),因为{{1 }}