Roy*_*mir 5 c# garbage-collection .net-4.5
我很难理解WaitForFullGCComplete 和 之间有什么区别WaitForPendingFinalizers + collect.
我已经知道当创建一个新对象(它有一个终结器)时 - 在该对象中创建了对该对象的引用finalization queue.
现在 - 当a GC .collect发生并发现应该收集对象时,从finalization queue 移动到的引用f-reachable queue.
队列中的这些引用被视为a root.现在 - 一个特殊的线程从睡眠中唤醒f-reachable queue并运行每个对象的finalize方法.
请注意,这是在collect阶段之后完成的.因此,只有下次我们运行GC.collect该对象才会真正消失.
如果我们想要等到f-reachable queue's线程完成所有finalize方法 - 我们应该调用:WaitForPendingFinalizers.
现在如果我们想要完全收集,那么我们应该再次运行GC.collect!
如果是这样的话 - 似乎可以通过以下方式制作完整的 GC:
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true);
GC.WaitForPendingFinalizers();
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true);
Run Code Online (Sandbox Code Playgroud)
那我为什么需要 GC.WaitForFullGCComplete()呢?
该文件说:
返回已注册通知的状态,以确定公共语言运行库是否已完成完整的阻塞垃圾回收.
题
我不明白:我已经知道Gc何时完成并且就在那时:
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true);
GC.WaitForPendingFinalizers();
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true);
//HERE <--
Run Code Online (Sandbox Code Playgroud)
那么我何时应该使用该方法而不是我的代码呢?
NB
但它们的用法并不完整,因为 - 更不用说还有另一种方法必须成对调用:
从CLR到C#4:
请注意,您应该始终成对调用
WaitForFullGCApproach和WaitForFullGCComplete方法,因为CLR在内部将它们作为对处理.
除非我误解了,你指出的链接中的用法都是错误的.当你通过C#CLR从报价,双方WaitForFullGCApproach并WaitForFullGCComplete应成对使用.
WaitForFullGCComplete是非常不同的Collect + WaitForPendingFinalizers.它的用法完全不同.
假设您正在编写一个高性能,低延迟的服务器应用程序,每秒处理数千个请求.显然,服务器会分配大量的内存,可以触发一个完整的gc(阻塞!),这对我们来说是个坏消息.
是完整的gc需要一段时间才能完成,直到那时你无法处理来自客户端的请求(因为你的线程将被暂停).高性能应用不希望在高峰时间容忍完整的gc.
在这种情况下,如果你想重定向进一步要求,它可以处理他们一些其他的服务器,你会使用GC.RegisterForFullGCNotification,GC.WaitForFullGCApproach和GC.WaitForFullGCComplete分别的方法.
WaitForFullGCApproach 将阻止,直到GC决定执行完整的gc,这是一个通知您主动重定向请求或采取一些行动.
然后WaitForFullGCComplete将阻止直到完整的gc完成.这是一个通知,您可以再次开始处理请求.
GC.RegisterForFullGCNotification docs提供了一个很好的例子并更好地解释了它.
| 归档时间: |
|
| 查看次数: |
2683 次 |
| 最近记录: |