Dem*_*sch 5 .net c# garbage-collection
我使用dotMemory来分析我的应用程序,并且注意到以下行为:在代码内,有些地方我使用手动执行垃圾收集
GC.Collect();
GC.WaitForPendingFinalizers();
Run Code Online (Sandbox Code Playgroud)
在dotMemory内部,我发现这些点实际上已释放了内存,但是如果此后单击“ Force GC”,则会收集更多垃圾。他们这样做的方式是什么?为什么我的代码没有收集该内存,并且实现相同级别的收集有可能吗?
我附上了屏幕截图,您可以在其中看到第2代的dotMemory几乎减半
我也尝试过执行多个收集,即
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
Run Code Online (Sandbox Code Playgroud)
即使它似乎回收了更多的内存,它也永远不会接近dotMemory的执行方式
小智 3
来自JetBrain 论坛 :
“强制 GC”按钮从本机代码调用 GC。
当您从代码中调用 GC.Collect() 方法时,它会执行以下步骤:
释放可立即释放的内存 查找具有 Finalize 方法的对象并将其放入队列 GC.Collect() 只释放托管对象。此外,CLR 有几种不同的 GC 策略,根据情况应用这些策略,以尽量减少导致 GC 的延迟,我们无法影响它。如果托管对象没有 Finalize 方法或者该方法实现不正确,则这些对象使用的本机内存将永远不会被释放。
我们建议您使用 GC.Collect 调用 WaitForPendingFinalizers 方法并重复多次:
for (int i = 0; i < 4; i++)
{
GC.Collect(2, GCCollectionMode.Forced, true);
GC.WaitForPendingFinalizers();
}
Run Code Online (Sandbox Code Playgroud)
它可以显示更好的结果,但我们不能保证此代码将导致与从本机代码调用的 Full GC 相同的结果。
GC.Collect方法:https://msdn.microsoft.com/en-us/library/hh138633 (v=vs.110).aspx