Frage

Ich las einen Blogeintrag von Josh Smith, wo er einen Cache-Mechanismus verwendet, um „Heapfragmentierung verwaltet reduce“. Sein Caching reduziert die Anzahl der kurzlebigen Objekte auf Kosten der etwas langsamer Ausführungsgeschwindigkeit erzeugt wird.

Wie viel von einem Problem wird Heapfragmentierung in einer verwalteten Sprache wie C # verwaltet? Wie kann man diagnostizieren, wenn es ein Problem ist? In welchen Situationen würden Sie in der Regel zu Adresse brauchen?

War es hilfreich?

Lösung

  

Wenn

Nicht zu schnell. Es ist im Allgemeinen sehr billig kurzlebige Objekte zu haben. Für einen Cache profitabel sein würde es viele candiadates sein müssen (sehr), und sie sollten lange genug leben, um es an die nächste Generation zu machen.

  

Wie kann man diagnostizieren, wenn es ein Problem ist?

Mit einem Profiler. Ich bin nicht so sicher, dass der Autor des Artikels getan.

  

Wie viel von einem Problem wird Heapfragmentierung in einer verwalteten Sprache wie C # verwaltet?

Soweit ich weiß, es ist selten. .NET verfügt über eine Verdichtung Garbage Collector, das verhindert, dass die meisten Formen der Fragmentierung. Es gibt Probleme mit dem Large Object Heap manchmal.


Edit:

Wenn Sie die Kommentare unter dem Artikel durchlaufen wird, dass jemand gemessen sie finden und fand den Cache viel langsamer als die Schaffung neuer EventArgs jedes Mal.

Fazit: Messen, bevor Sie die Optimierung starten. Das war keine gute Idee / example.

Andere Tipps

Wenn Sie mit 10K + kleinen kurzlebigen Objekten pro Sekunde zu tun hat, es sollte kein Problem überhaupt mit vertretbarer Menge an RAM auf einen modernen Computer sein.

Also zuerst sollten Sie den Code in allen vernünftigen Szenarien laufen und wenn es schnell genug ist -. Mach dir keine Sorgen darüber

Wenn Sie nicht zufrieden mit der Geschwindigkeit sind, sehen Sie, dass Code irgendwann ‚würgt‘ oder einfach nur neugierig, können Sie verschiedene .NET-Speicherstatistik ( http://msdn.microsoft.com/en-us/library/x2tyfybc.aspx ) in Performance Monitor-App (kommt als Teil von Windows ). Insbesondere sind Sie in% Zeit in GC interessiert.

redgate ANTS Profiler überwacht auch diese Statistiken.

Managed Heap-Fragmentierung ist in der Regel wegen der Objekte der Pinning. Objekte erhalten gemerkt, wenn verwalteten Code das Objekt Zeiger auf den nativen Code übergibt und das Objekt kann nicht verschoben werden, da der Verweis auf den nativen Code übergeben wird. Dies ist sehr häufig, wenn es eine Menge von E / A-Aktivitäten. Wie in der Regel oben erwähnt, geschieht nur in LOH.

Hier ist ein Beispiel von

Im Gegensatz zu anderen Antworten gegeben hier I-Zustand: Ja, man sollte die Fragmentierung kümmern! Es ist nicht nur auf verwaltete Haufen gilt, sondern für alle Anwendungen Umgang mit (mindestens)

  • viele "große" ressources in
  • ein schweres Zuordnungsmuster.

Da das LOB verdichtet nicht bekommen, es - im Laufe der Zeit - die meisten wahrscheinlich wird so schnell wie die Größe und Anzahl der Objekte überschreitet erhält fragmentiert einen bestimmten Wert (die zur Verfügung, die insgesamt max Heapsize bezieht). Ist dies der Fall, ist der einzig sichere Weg, um die Anzahl der sofort holded Verweise auf diese Objekte zu begrenzen. Ein Cache (Pool) würde nur helfen, wenn gepoolt Objekte wiederverwendet werden können. Manchmal, wenn diese Ressourcen von Arrays unterschiedlicher Länge F. E. hergestellt werden, können sie nicht wiederverwendbar leicht sein. Hilfe kann nicht viel hier so Pooling.

Wie es zu erkennen? Wann immer es großer Druck auf dem LOB Heap. So finden Sie heraus, es ist? Verwenden Sie den .NET-Leistungsindikatoren „Collection Count Gen 0 ... 2“ zur selben Zeit. Wenn zu viele große Objekte aus der LOB zugeordnet sind, wird sich entwickeln alle Zähler identisch. Das heißt, im Grunde alle Sammlungen sind teuer Generation 2 Sammlungen. In diesem Fall sollte etwas getan werden.

In Bezug auf kleinere Objekte, würde ich die GC die ganze Arbeit in Gen 0 Sammlungen und Sorgen Sie sich nicht lassen.

scroll top