Ich habe einen Windows-Dienst, der viele Remote-Fernanrufe durchführt, um einige Serverinformationen zu erhalten. Mir ist aufgefallen, dass der Speicher des Dienstes, solange die Zeit vergeht, wächst, bis eine Speicherausnahme ausgelöst wird. Ich habe gesucht und es sieht so aus, als ob es ein bekanntes Speicherleck in System.Management.Automation
gibt, das nicht den gesamten Speicher von Runspace
enthält, der beim Aufruf der Methode close und / dispose erstellt wurde. Ich habe einen Beitrag gelesen, in dem vorgeschlagen wurde, CreateOutOfProcessRunspace
von RunspaceFactory
zu verwenden, aber nicht sicher, wie er verwendet werden soll.
So kann das Problem reproduziert werden: ( System.Management.Automation
dll referenziert)
Wenn Sie diesen Code ausführen, sehen Sie, wie der Speicher inkrementiert wird. Aufgrund der Anforderungen ist es eine gute Lösung, eine Verbindung so weit wie möglich offen zu halten.
Weißt du, wie ich dieses Problem beheben kann, sogar mit der CreateOutOfProcessRunspace
-Methode von RunspaceFactory
oder wie man den Speicher entsorgt?
Vielen Dank im Voraus
BEARBEITEN
Ich benutzte die V3 und ändere die Erstellung des Runspace, um die CreateRunspacePool-Methode zu verwenden, und es sieht so aus, als wäre das Leck verschwunden. Vielen Dank für deine Hilfe!
Ich kann das Problem in PS v3.0 sehen, aber nicht in PS v2.0. Hier ist der Code, den ich verwendet habe Siehe hierzu (alle Beispiele sind in PowerShell):
%Vor%Es sieht so aus, als ob Handles und Speicher in v3.0 im obigen Code undicht sind.
Soweit v2.0 dieses Problem nicht aufweist, kann eine mögliche Problemumgehung sein
Starten Sie den Dienst mit PS v2.0, d. h. PowerShell.exe -Version 2.0
.
Wenn das nicht möglich ist, kann ich mir zwei weitere Problemumgehungen vorstellen. Einer von ihnen ist nicht
Um Runspaces direkt zu erstellen, verwenden Sie stattdessen [powershell]
. Zum Beispiel, dies
Code zeigt das Leck in v3.0 nicht an:
Eine andere Problemumgehung, falls zutreffend, kann die Verwendung von sein %Code%. Dieser Weg zeigt auch nicht die Leck:
%Vor%Der letzte arbeitet auch viel schneller, weil der runspace irgendwie wiederverwendet wird.
Ich hatte auch das gleiche Problem, als ich v1 von System.Management.Automation verwendete . Aber das Problem wurde mit v3 von System.Management.Automation gelöst und der zu verwendende Code geändert die Methode CreateOutOfProcessRunspace
Hier ist der Code
%Vor%Tags und Links memory-leaks memory c# powershell runspace