Dies ist eine Follow-up-Frage zu meiner vorherigen Frage
>Wie in diese Antwort auf meine vorherige Frage vorgeschlagen wurde, I verwende ProcessExplorer , um eine Liste von Handles zu analysieren, die meine Anwendung zur Suche nach einem Handle-Leak verwendet.
Die ausgelaufenen Handles haben den Typ Abschnitt .
Was genau ist ein Abschnitts-Handle, wo wird es verwendet und was kann dazu führen, dass Abschnitts-Handles auslaufen?
Ich verwende keine Speicherabbilddateien in meinem Code.
Zitat Mark Russinovichs Inside Windows 2000 (was jetzt Windows Internals genannt wird),
Das -Abschnittsobjekt , das das Win32-Subsystem ein Dateizuordnungsobjekt aufruft, stellt einen Speicherblock dar, den zwei oder mehr Prozesse gemeinsam nutzen können.
Also, es ist eine Memory-Mapped-Datei. Sie würden auslaufen, wenn Sie eine Speicherabbilddatei erstellen und sie nicht schließen konnten. Ziemlich schwierig, viel spezifischer zu sein.
Es stellt sich heraus, dass das Problem in einer Low-Level-Funktion liegt, die die Anzahl der Threads des aktuellen Prozesses zählt. Diese Funktion hat das
verwendet %Vor%API-Funktion, die ein Handle zurückgibt, das nicht ordnungsgemäß geschlossen wurde. Ich bin mir nicht sicher, warum dies eine Section Handle Leck erzeugt.
Eine Memory-Mapped-Datei, die keinem Datei-Handle zugeordnet ist, kann für IPC (Kommunikation zwischen Prozessen) verwendet werden. Wenn Sie sie nicht direkt verwenden, führt möglicherweise eine Ihrer Einheiten oder Komponenten eine IPC-Kommunikation durch. Es ist sehr wahrscheinlich, dass Sie eine Komponente verwenden, um eine Verbindung zu einem anderen Prozess herzustellen, und sie nicht wie gewünscht freizugeben.
Die erste zu ergreifende Maßnahme besteht darin, nach einem Speicherleck zu suchen (mit dem FastMM4-Debug-Modus), und Sie werden sicher einige nicht freigegebene Objekte in Ihrem Code finden.
Da Griffe normalerweise von Objekten zugewiesen werden, löst das Auflösen aller Speicherlecks aus meinem Experiment Handle-Leaks.
Wenn Sie kein Speicherleck haben, gibt es einige CreateFileMapping()
Aufrufe, um nach einem entsprechenden CloseHandle()
in Ihrem gesamten Quellcode (einschließlich Drittanbieter-Quelle) zu suchen.
Das Abschnittshandle-Leck in .net ist aufgrund des Microsoft Hotfix KB2670838. Deinstallieren Sie dieses Update, und das Problem mit der Speicherleckage (nicht genügend Arbeitsspeicher) wird behoben.
%Vor%Tags und Links windows delphi delphi-xe handle resource-leak