2016-06-11 9 views
0

Ich habe eine C# -Konsolenanwendung, in der ich (ohne die Hilfe von Visual Studio) programmatisch GC-Aktivität programmieren möchte. wenn ich diesen Code habe zum Beispiel:Wie programmiere ich GC-Aktivität in einer C# -Anwendung?

public static void Main() 
{ 
    for (int i = 0; i < 100000; i++) AllocateByteArray(); 
} 

private static void AllocateByteArray() 
{ 
    new byte[1000]; 
} 

Gibt es eine Möglichkeit, die GC Klasse zu verwenden, um zu überwachen, wie oft eine Garbage Collection stattfindet, während die Schleife läuft? Ich versuchte zunächst so etwas wie diese:

Console.WriteLine("Before:"); 
Console.WriteLine(GC.GetTotalMemory(false)); 

// do work... 

Console.WriteLine("After:"); 
Console.WriteLine(GC.GetTotalMemory(false)); 

Console.WriteLine("After collection:"); 
Console.WriteLine(GC.GetTotalMemory(true)); 

aber ich erkennen die Messungen nicht wirklich mir nichts sagten, da eine GC wahrscheinlich aufgetreten, während ich mit der Arbeit tat. Ich kenne mich mit den GC-APIs in .NET nicht aus. Gibt es eine Möglichkeit, diese Arten von Statistiken programmatisch zu messen? Vielen Dank.

+0

https://msdn.microsoft.com/en-us/library/w8f5kw2e(v=vs.110).aspx –

+0

Weitere GC Literatur zum Thema: [Jeder denkt über Garbage Collection der falsche Weg] (https: //blogs.msdn.microsoft.com/oldnewthing/20100809-00/?p=13203), [Wann wird ein Objekt für die Garbage Collection verfügbar?] (https://blogs.msdn.microsoft.com/oldnewthing/20100810 -00 /? P = 13193) und Wenn alles, was Sie wissen, falsch ist [Teil 1] (https://ericlippert.com/2015/05/18/when-everything-you-know-is-wrong-part-one/) [Teil 2] (https://ericlippert.com/2015/05/21/when-everything-you-know-is-wrong-part-two/) – theB

Antwort

1

Ich kann nicht sagen, dass ich weit genug entfernt bin, um direkt hilfreich zu sein, aber es gibt ein paar Dinge, die ich hochgezogen habe, als ich neugierig auf eine Antwort gejagt bin. Hoffentlich sind diese Dinge im Hinblick auf das spezifische Bit über "ohne die Hilfe von Visual Studio" nicht unerheblich

Es gibt einen anderen Thread hier auf SO darüber. Monitoring Garbage Collector in C#

Und MSDN hat einige Dokumentation in Bezug auf es. https://msdn.microsoft.com/en-us/library/ee851764(v=vs.110).aspx

Für mich ist der Müllsammler eine ziemlich mystische Sache, immer noch.

1

Wenn Sie keine Hintergrundbereinigung durchführen, können Sie ein ereignisbasiertes System verwenden, um garbage collection notifications zu empfangen.

Die Methode "RegisterForFullGCNotification" registriert, dass eine Benachrichtigung ausgelöst wird, wenn die Laufzeit feststellt, dass sich eine vollständige Speicherbereinigung nähert. Diese Benachrichtigung besteht aus zwei Teilen: Wenn sich die vollständige Speicherbereinigung nähert und die vollständige Speicherbereinigung abgeschlossen ist.

Beachten Sie die Warnung, dass dies nicht für den Hintergrund Sammlung

Nur blockiert Garbage Collection-Benachrichtigungen erhöhen funktioniert. Wenn das Konfigurationselement <gcConcurrent> aktiviert ist, werden Benachrichtigungen über Hintergrundbereinigungen nicht ausgelöst.