垃圾回收-C#-GC友好指针空间打开
本文关键字:指针 空间 -C#-GC | 更新日期: 2023-09-27 17:59:14
假设我在BitmapImage对象中存储了一个大位图:
BitmapImage img = new BitmapImage();
无论出于什么原因,我都需要添加更多的指针:
BitmapImage p1 = img;
BitmapImage p2 = img;
BitmapImage p3 = img;
现在,如果我不再需要img,我会将其设置为空指针:
img = null;
这足以让GC正确地将其隔开吗?或者是否也有必要执行以下操作:
p1 = null;
p2 = null;
p3 = null;
根据为进程分配的内存输出,只有当最后一个指针设置为null时,才会释放内存。我使用了一个大列表,因为空的BitmapImage在内存中非常小。
交互式C#:
> Console.WriteLine(Process.GetCurrentProcess().PrivateMemorySize64);
. var l = Enumerable.Repeat(123, 10000000).ToList();
. Console.WriteLine(Process.GetCurrentProcess().PrivateMemorySize64);
. System.GC.Collect();
. Console.WriteLine(Process.GetCurrentProcess().PrivateMemorySize64);
140423168
270663680
207835136
> Console.WriteLine(Process.GetCurrentProcess().PrivateMemorySize64);
. System.GC.Collect();
. Console.WriteLine(Process.GetCurrentProcess().PrivateMemorySize64);
207761408
207761408
> Console.WriteLine(Process.GetCurrentProcess().PrivateMemorySize64);
. var p1 = l;
207831040
> Console.WriteLine(Process.GetCurrentProcess().PrivateMemorySize64);
207851520
> var p2 = l;
. Console.WriteLine(Process.GetCurrentProcess().PrivateMemorySize64);
. var p3 = l;
. Console.WriteLine(Process.GetCurrentProcess().PrivateMemorySize64);
208273408
208273408
> Console.WriteLine(Process.GetCurrentProcess().PrivateMemorySize64);
. l = null;
. System.GC.Collect();
. Console.WriteLine(Process.GetCurrentProcess().PrivateMemorySize64);
. p1 = null;
. System.GC.Collect();
. Console.WriteLine(Process.GetCurrentProcess().PrivateMemorySize64);
. p2 = null;
. System.GC.Collect();
. Console.WriteLine(Process.GetCurrentProcess().PrivateMemorySize64);
. p3 = null;
. System.GC.Collect();
. Console.WriteLine(Process.GetCurrentProcess().PrivateMemorySize64);
208314368
208314368
208314368
208314368
141033472