Garbage Collection in .NET (Generationen)
Habe ich viel gelesen .NETTO-performance Artikeln, die beschreiben, Gen1,Gen2 garbage collection und Objekte, die das überleben der Generationen.
Warum Objekte überlebt die Sammlung?
Was ist pinning?
Wie kann ich lernen mehr zu diesem Thema?
Kommentar zu dem Problem
Sie erhalten eine Kopie der " CLR via C# und Lesen Sie die Kapitel, die auf die Garbage collection. Es ist ein wenig fleischig Thema - zu lernen, aus einem online-forum.
InformationsquelleAutor der Frage SNA | 2009-06-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen Grund haben Sie mehrere Generationen in einem garbage-collector ist zu vermeiden, dass Speicher-Fragmentierung.
Jedem Funktionsaufruf kann bedeuten, die Schaffung und
LöschungSammlung von mehreren Objekten, und so der Speicher-heap für das Programm neigt dazu, fragment sehr schnell. Diese Blätter Löcher dahinter sind nicht sehr brauchbar. Das Ergebnis ist, dass Ihr Programm muss in regelmäßigen Abständen de-fragmentiert wie eine Festplatte. Dies ist Teil von dem, was passiert während einer Sammlung.Wenn ein Objekt überlebt, eine Sammlung, die es bewegt wird, um ein längerfristiges generation auf der Theorie, dass, wenn es überlebt Sammlung wird es wohl überleben, andere. Damit die späteren Generationen haben weniger turn-over " und " don ' T fragment so viel. Dies bedeutet, dass Ihr Programm verbringt weniger Zeit insgesamt jonglieren, um Sachen zu bereinigen, die Löcher und die Abfälle, die weniger Speicher. Auch dies ist eine Verbesserung gegenüber der traditionellen Speicherverwaltung (malloc/free oder new/delete), die es bis um das Betriebssystem zu verwalten Fragmentierung des Speichers.
Dem Grund ein Objekt überlebt Sammlung ist, weil es irgendwo etwas, das noch "im Rahmen" und hält eine Referenz auf das Objekt. Es gibt ein paar Möglichkeiten, wie Sie kann dazu führen, diese zu passieren, und dann vergessen Sie die Referenz, so ist es möglich, "Leck" memory in verwaltetem code.
Menschen manchmal versucht sind zu nennen
GC.Collect()
im bemühen um den garbage collector zu etwas reinigen. Vielleicht haben Sie entdeckt, Sie haben ein Leck, oder denke, Speicher ist immer über-fragmentiert. Sie sollte der Versuchung widerstehen, diese fordert. Während die garbage collection in .Net ist nicht perfekt, ist es sehr gut und es ist fast sicher viel besser als bei der Reinigung mit dem Speicher, als Sie sind. Chancen sind, dass, wenn ein Objekt kann und sollte erhoben werden. Denken Sie daran, dass der AufrufGC.Collect()
können tatsächlich noch schlimmer machen, indem Sie den garbage collector Objekte bewegen, Sie auf eine höhere generation, und dadurch, dass Sie schon seit länger als Sie es sonst wäre.Statt, wenn Sie vermuten, Sie haben ein Leck, suchen Sie Ihre eigenen code für so etwas wie eine Globale oder statische Variablen, die möglicherweise einen Verweis auf eine Menge anderer Elemente. Das einzige mal, sollten Sie rufen
GC.Collect()
ist, wenn Sie Informationen über die Art des Programms, die nicht verfügbar für den garbage collector, und das ist ziemlich selten, wie der GC kennt jeder Referenz, die Sie erstellt haben."Pinning" ist, wenn Sie benötigen, um ein Objekt übergeben, um einen nicht verwalteten Bibliothek. Der garbage collector kann das verschieben eines Objekts Physischer Speicherort im Speicher, und so müssen Sie "pin" und an einem Ort oder der Zeiger verwendet, die von nicht verwalteten Bibliothek ungültig. Ein fixiertes Objekt können nicht gesammelt werden, und so sollten Sie nicht pin ein Objekt für mehr als notwendig.
InformationsquelleAutor der Antwort
http://blogs.msdn.com/maoni/ ist eine gute Ressource.
Fragen, Fragen, hier hilft auch 🙂
Für Ihre Fragen:
Warum Objekte überleben der Sammlung:
Objekte überleben, eine Sammlung, wenn Sie "live Objekte", oder "Erreichbar-Objekte". Erreichbar-Objekte sind Objekte, wo es einen Verweis auf Sie aus einem anderen Objekt auf:
Was ist Pinning:
Pinning bedeutet, dass Sie sicher das Objekt bewegt sich nicht im Speicher. Objekte verschieben in der Erinnerung als ein Ergebnis von ein compacting GC, können Sie ein GCHandle von typisierten angeheftet wenn Sie anheften möchten Sie ein Objekt, das anheften geschieht auch automatisch hinter der sciene für Objekte übergeben werden, um native code per PInvoke ( wie strings übergeben werden, die als Ausgang, der interne Puffer wird festgesteckt, während der call to PInvoke ).
Check-out http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.gchandle.aspx für ein gutes Beispiel, über das GCHandle.
InformationsquelleAutor der Antwort mfawzymkh
Hier ist ein kurze, aber vollständige Programm, das ich schrieb demostrate Generation 2 garbage collection in einer Laufenden Anwendung
http://nomorehacks.wordpress.com/2008/11/27/forcing-the-garbage-collector/
InformationsquelleAutor der Antwort No More Hacks
Dachte ich dieser Artikel war ziemlich gut.
InformationsquelleAutor der Antwort Shane Fulmer
http://msdn.microsoft.com/en-us/library/ms973837.aspx
Sehr großes Thema. Oben ist eine gute Zusammenfassung von FRAU
InformationsquelleAutor der Antwort Inisheer
Diese ist ein interessanter Artikel zum Thema, finden Sie vielleicht informativ.
InformationsquelleAutor der Antwort Paul Sonier
Pinning verwendet wird, um die vom garbage collector verlagern Objekte. Es können Leistungseinbußen durch Einschränkung der garbage collector kann. Im Allgemeinen angeheftete Objekte sollten fixiert werden, für kurze Zeit wie möglich.
InformationsquelleAutor der Antwort Jim Barnett