Speicherleck in .NETCF - Erstellung von dynamischen Kontrollen?
-
03-07-2019 - |
Frage
Ich habe ein Problem mit einem Speicherverlust in einer Anwendung .NET CF.
Mit RPM ich, dass dynamisch identifiziert die Schaffung Kontrollen sind nicht wie erwartet Müll gesammelt. Das Ausführen des gleichen Stück Code in .NET Fensterformen verhalten sich anders und verfügt die Steuerung als ich erwartet hatte.
Sehen Sie die Ausgabe von RPM über PerfMon für die Prozess Heap Zähler:
GC Heap:
Meine beste Vermutung ist, dass die schwache Referenz auf das Panel aus unbekannten Gründen ist die Aufgabe, die für GC nicht machen, kann es sein?
Bitte beachten Sie: Auch wenn Dispose () , um das Problem für die Probe löst, kann ich nicht einfach in die bestehende Anwendung integrieren, da es nicht so eindeutig ist um zu bestimmen, wenn das Objekt nicht mehr in Gebrauch ist.
Ich habe eine vereinfachte Version der Quelle enthält, das Problem zu veranschaulichen:
using System;
using System.Windows.Forms;
namespace CFMemTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
// Calling this event handler multiple times causes the memory leak
private void Button1_Click(object sender, EventArgs e)
{
Panel uc = new Panel();
// Calling uc.Dispose() cleans up the object
}
}
}
Update:
1. Aufruf GC.Collect () führt auch nicht in den Platten nach oben gereinigt.
2. Mit .NET CF 2.0 SP1 auf einem Windows CE 4.2-Gerät.
Lösung
Einige zusätzliche Informationen hier, die dieses Verhalten erklärt.
Alles UI auf NETCF bezogen ist absichtlich von GC Umfang entfernt, so es wird nie gesammelt . Dieses Verhalten unterscheidet sich von Desktop und hat in NETCF V3.5 geändert (es sei denn, läuft im Kompatibilitätsmodus).
Es ist so anders, weil verwaltet UI Klassen auf NETCF sind vollständig unterscheidet sich von dem Desktop. Sie sind dünn Wrapper über native Implementierung die erforderlich war akzeptabel zu erreichen Leistung.
Ich bin mir nicht sicher, dass es eine solche Ressource. Aber wirklich, alle müssen Sie wissen, ist: es gesammelt nie, muss anrufen entsorgen. Sie sollten eigentlich tun, als auch auf dem Desktop, aber wenn Sie dies nicht tun sein Weg mehr zu vergeben. Nicht bald NETCF.
Andere Tipps
Ein Formular Entsorgen nicht automatisch alle Steuerelemente in seinem Code erstellt, da es keine Möglichkeit hat, zu wissen, dass es existiert. Um das Formular zu erhalten Formular automatisch zu entsorgen, wenn es Angeordnet, müssen Sie es die Controls-Sammlung hinzuzufügen.
Jetzt in Ihrem Fall, dass nichts tun kann. Ich kann nicht sagen, ob Ihr Beispiel gekünstelt ist, oder reale Welt. Wenn es der realen Welt ist, dann wird das Verhalten zu erwarten, da das Gremium nicht gesammelt wird erhalten, wenn die Variable den Gültigkeitsbereich verlässt (nicht sicher, ob es auf dem Desktop funktioniert entweder). Es wird für die Sammlung zur Verfügung, aber das bedeutet einfach, dass auf der nächsten Sammlung übergibt es gefegt wird. Sofern Sie eine GC sind verursacht, dann geht es nicht befreit werden.
Ich würde empfehlen Ihnen einen Blick auf die
Sind Sie sicher, dass Sie einen Speicherverlust haben? Das .NET Compact Framework Garbage Collector arbeitet etwas anders als die in der Vollversion von .NET Framework. Aus Steven Pratschner Blog : Eine Sammlung wird eingeleitet, wenn entweder: 1MB von Objekten zugeordnet wurde, Eine Anwendung in den Hintergrund verschoben wird, Ein Fehler Speicher zuzuweisen tritt Eine Anwendung ruft GC.Collect.
Ich glaube, Sie brauchen, um dynamisch auf die Schaltfläche klicken Eventhandler zu entfernen, wie Sie aus diesem Blog sehen kann: http://blogs.msdn.com/stevenpr/archive/2007/03/08/finding-managed-memory-leaks-using-the-net-cf-remote-performance-monitor.aspx
Es ist von Steven Pratschner auch.
Durch die Art und Weise, die Webcast oben erwähnt wird hier verknüpft: http://msevents.microsoft.com/cui/ WebCastEventDetails.aspx? Kultur = en-US & EventID = 1032318791 & Countrycode = US
Hope, das hilft!