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:
alt text

GC Heap:
alt text

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.

War es hilfreich?

Lösung

Einige zusätzliche Informationen hier, die dieses Verhalten erklärt.

Nach Ilya Tumanov :

  

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!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top