2010-12-09 5 views
5

Wir haben eine ziemlich große Silverlight 4-Anwendung. Wir sind dabei, Speicherlecks in der Anwendung zu finden, und dies hat sich zu einer entmutigenden Aufgabe entwickelt.Silverlight Memory Leaks

Die Dinge haben sich komplett mit diesem geändert, für diejenigen von euch, die den ursprünglichen Post gesehen haben!

Ich erkannte, dass ANTS Speicher Profiler zeigte mir nicht die richtigen Sachen. Das lag daran, dass das Speicherleck nicht im verwalteten Code, sondern im systemeigenen Code enthalten war. Ich habe ein paar Probleme mit ANTS behoben - es ist ein gutes Werkzeug für Speicherlecks mit verwaltetem Code.

So fand ich diesen Blog,

http://blogs.msdn.com/b/slperf/archive/2010/08/19/analyzing-silverlight-memory-usage-part-1-obtaining-measurements.aspx

war ausgezeichnet. Ich habe xPerf und xPerfViewer verwendet, um den systemeigenen Heap anzuzeigen und zu sehen, was ich vermute, ist der tatsächliche Speicherverlust.

So kann ich einen Stack-Trace, die wie folgt aussieht,

CCoreServices::Draw 
    CCoreServices::Tick 
    CUElement::Render 
     CUIElement::Render 
     CUIElement::RenderWithTransform 
     CUIElement::RenderVisual 
     CUIElement::RenderChildren 
      {Repeat of the above in a recursive fashion} 

So in dieser Methode ‚Render‘ irgendwo ordnet etwa 520 Byte Speicher, und soweit ich es tut kann nicht sagen, befreie es.

Ich kann auch eine Methode oder Klasse

SDBitmapCreate 

ist Speicher undicht sehen, genannt.

Interessant, weil es scheint, als ob ich etwas gefunden habe, aber ich bin nicht wirklich sicher was.

Haben Sie noch weitere Vorschläge?

Danke.

+0

Wie verwenden Sie ANT, um Speicherlecks zu erkennen? Das einzige "ANT", das ich kenne (oder über Google finden konnte), ist das Java-Build-Tool (http://ant.apache.org/). Ist es das, worauf du dich beziehst, oder gibt es ein Silverlight ANT-Tool, von dem ich nichts weiß (und es unbedingt tun muss)? –

+0

Macht nichts, entdeckte es schließlich: http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/ –

+0

Ja, das ist die eine. Sie können nach Namespace filtern, und normalerweise erwarten Sie bei einem Speicherleck Klassen in Ihren eigenen Namespaces, die undicht sind. Das ist hier nicht der Fall, Sachen im Silverlight-Framework sind undicht. Ich bin mir sicher, dass wir es verursachen, aber es macht es nur schwieriger zu erkennen, und es ist schwieriger, die Ursache zu finden. – peter

Antwort

4

Erstens, ich kenne keine Memory-Leak-Tools für Silverlight.

Ich habe erlebt, was ich dachte, wo Speicherleck Probleme vor ein paar Wochen. Stellt sich heraus, meine Silverlight-Anwendung hatte Schurken Kinder in der Leinwand.

Mein Problem möglicherweise nicht Ihr Problem, aber es kann Sie denken.

Bevor ich meine Liste mit den Ergebnissen vom Server erneut ausgefüllt habe, musste ich alle untergeordneten Elemente aus dem entsprechenden Zeichenbereich entfernen. Löschen der Liste war nicht genug .:

 for (int i = 0; i < boxDataLabel.Count; i++) 
     { 
      canvaz.Children.Remove((Label)boxDataLabel[i]); 
     } 
     boxDataLabel.Clear(); 

boxDataLabel ist eine Liste des Typs Label.

viel Glück.

+0

Warum also schafft das ein Speicherleck? Da muss etwas offen gehalten werden, hast du herausgefunden, was genau das war? – peter

6

Es gibt ein gutes Tutorial zur Fehlersuche bei Silverlight Memory Leaks: http://davybrion.com/blog/2009/08/finding-memory-leaks-in-silverlight-with-windbg/. Es ist kompliziert, und Sie müssen mit WinDBG-Befehlen umgehen, aber ich habe es in der Vergangenheit hilfreich gefunden. Natürlich beantwortet dies Ihre Frage nicht spezifisch, aber es kann Sie in die richtige Richtung weisen.

+0

Ausgezeichnetes Tutorial! –

2

Es gibt ein offizielles Speicherleck bezüglich Inline-DataTemplates in Xaml. Sie können hier einen Thread darüber lesen: http://forums.silverlight.net/forums/t/171739.aspx.

Microsoft hat eine Serviceversion veröffentlicht (Update Build 4.0.50826.0) das sollte das Problem beheben: http://timheuer.com/blog/archive/2010/09/01/silverlight-service-release-september-2010-gdr1.aspx

Denken Sie daran, die Mindestversion in der Host-HTML-Datei zu aktualisieren, wenn der Service-Release (einige von) Ihre Probleme beheben.

+0

Die September-Ausgabe behob einige der Probleme, aber nicht alle von ihnen. Das Silverlight-Team testet derzeit eine Korrektur, die hoffentlich bald veröffentlicht wird. –

1

Wenn ich in Ihrer Situation wäre, würde ich versuchen, eine einfache Testanwendung zu erstellen, die das Leck demosiert, nur um zu überprüfen, dass es außerhalb Ihres tatsächlichen Codes wiederholbar ist. Dies beweist, dass es sich nicht um einen kleinen Fehler in Ihrem Code handelt. Dann würde ich die Test-App in den MS Silverlight-Foren veröffentlichen, die von MS-Leuten überwacht werden. Wenn Sie ein MSDN-Abonnement haben oder wenn Ihr Unternehmen eine Support-Vereinbarung mit MS hat, würde ich auch ein "Ticket" (vergessen, wie sie es nennen) mit MS öffnen.

Verwandte Themen