2010-02-23 4 views
5

Hier ist meine Situation. Ich möchte eine Erklärung, warum das passiert. Ich lese über GC here, aber ich verstehe es immer noch nicht.Warum scheint ich einen Speicherverlust zu haben, wenn Benutzer "Server" Garbage Collection?

Workstation Fall: Wenn ich mit Workstation Garbage Collection ausgeführt werde, ramps meine App ca. 180 MB private Bytes und ca. 70 MB in ".NET CLR Memory #bytes in allen Haufen". Der Speicher bleibt mehrere Stunden lang stabil. Das leben ist gut.

Server Fall: Wenn ich mit Server Garbage Collection meine app Rampen laufen bis zu 500 MB privaten Bytes zu verwenden, aber nach wie vor nur etwa 70 MB in „.NET CLR-Speicher #bytes in allen Haufen“. Eine Analyse der! DumpHeap -stat-Ausgabe und! GCRoot zeigt viele Objekte ohne Wurzeln. Auch meine privaten Bytes erhöhen sich signifikant über mehrere Stunden, aber die .NET-Bytes bleiben konstant. Meine App verwendet viel nicht verwalteten Code, so denke ich, dass dies aufgrund des Unterschieds in privaten und .NET-Bytes zusammenhängt. Aber warum ist mein Leben im Serverfall so schlecht?

Irgendwelche GC Weisheit oder Anleitung zur weiteren Untersuchung?

Danke!

Antwort

5

"Server-Garbage-Collection" ist für Anwendungen mit hohem Durchsatz konzipiert, in erster Linie für Cluster-Server.

Ein Server-GC ist teuer und unterbricht laufende Threads während es passiert. Als solches braucht es mehr Speicherdruck, bevor es tatsächlich auslöst - wenn Sie noch Ersatzspeicher haben, seien Sie nicht überrascht, wenn der Müllsammler nicht das Bedürfnis verspürt, durchzugehen und noch aufzuräumen.