我们正在使用.NET运行Web场.每个Web服务器在其内存中都包含大量静态对象.Gen 2垃圾收集(GC)需要10-20秒,每5分钟运行一次.我们或多或少地遇到了StackOverflow遇到的相同问题:http://samsaffron.com/archive/2011/10/28/in-managed-code-we-trust-our-recent-battles-with-the- 净垃圾收集器
目前,我们正在减少缓存中的对象数量.但是,这需要时间.
同时,我们实现了此处记录的方法,以便在.NET中获取有关接近GC的通知.目标是在GC接近时将Web服务器从服务器场中取出,并在GC结束后将其包含在服务器场中.但是,我们只收到所有GC的0.7%的通知.我们使用maxGenerationThreshold和largeObjectHeapThreshold为8.我们尝试了其他阈值,但错过的GC数量没有变化.
我们正在使用并发服务器垃圾收集(http://msdn.microsoft.com/en-us/library/ms229357.aspx).GCLatencyMode是Interactive(请参阅http://msdn.microsoft.com/en-us/library/system.runtime.gclatencymode.aspx).在这里,我们再次尝试使用其他GC模式(工作站模式,批处理等).我们再次没有收到大多数GC的通知.
我们做错了什么,或者是否无法获得每个GC的通知?我们如何增加通知数量?
根据http://assets.red-gate.com/community/books/assets/Under_the_Hood_of_.NET_Management.pdf,一开始GC会在Gen2达到~10 MB时触发.我们有很多RAM,所以如果我们可以手动将此阈值设置为更高的级别,则需要更多时间才能达到此阈值,并且根据我的理解,获得通知的概率会增加.有没有办法修改这个阈值?
这是注册和侦听通知的代码:
GC.RegisterForFullGCNotification(gcThreshold, gcThreshold);
// Start a thread using WaitForFullGCProc.
thWaitForFullGC = new Thread(WaitForFullGCProc);
thWaitForFullGC.Name = "HealthTestGCNotificationListenerThread (Threshold=" + gcThreshold + ")";
thWaitForFullGC.IsBackground = true;
Run Code Online (Sandbox Code Playgroud)
WaitForFullGCProc():
private void WaitForFullGCProc()
{
try
{
while (!gcAbort)
{
// Check for a notification of an approaching collection.
GCNotificationStatus s;
do
{
int timeOut = CheckForMissedGc() > 0 ? 5000 : (10 * 60 * 1000); …Run Code Online (Sandbox Code Playgroud)