2016-06-13 11 views
0

Ich habe einen Dienst, der auf einem Domänencontroller ausgeführt wird, auf den zufällig von anderen Computern im Netzwerk zugegriffen wird. Ich kann den Dienst nicht herunterfahren und ihn nur bei Bedarf ausführen (dies würde den Zweck, ihn als Dienst auszuführen, sowieso nicht erfüllen). Das Problem besteht darin, dass der vom Dienst verwendete Speicher nicht gelöscht wird und sich jedes Mal erhöht, wenn der Dienst von einem Remotecomputer abgefragt wird. Gibt es eine Möglichkeit, das RAM, das von der Anwendung verwendet wird, zu begrenzen?Begrenzung des zulässigen RAM für einen Dienst, möglich mit MaxWorkingSet

Ich habe ein paar Verweise auf die Verwendung von MaxWorkingSet gefunden, aber keine der Referenzen sagen mir tatsächlich, wie man es benutzt. Kann ich MaxWorkingSet verwenden, um den verwendeten Arbeitsspeicher auf beispielsweise 35 MB zu begrenzen? und wenn ja, wie? (Was ist die Syntax usw.?)

Gibt es sonst eine Funktion wie "clearall()", die ich verwenden könnte, um die Variablen und den Speicher am Ende jedes Durchlaufs zurückzusetzen? Ich habe versucht, mit GC.Collect(), aber es hat nicht funktioniert.

Antwort

0

Wörtlich, MaxWorkingSet beeinflussen nur Arbeitssatz, der die Menge an physischem Speicher ist. Um die Gesamtspeicherauslastung einzuschränken, benötigen Sie Job Object API. Aber es besteht die Gefahr, wenn Ihr Programm wirklich solche Speicher benötigt (viele Codes keine OutOfMemoryException betrachten und manchmal .NET-Laufzeit hat seltsames Verhalten, wenn der Speicher nicht ausreicht)

Sie müssen:

  • a Erstellen Win32 Auftragsobjekt
  • die maximalen Speicher auf den Job
  • Ihren Prozesses, um den Job zuweisen Set

Here ist ein Wrapper für .NET. ^reference

Außerdem könnte man diese Methode der GC versuchen: (für .NET 4.6 oder höher)

GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce; 
GC.Collect(2, GCCollectionMode.Forced, true, true); 

GC.Collect(2, GCCollectionMode.Forced); 

Der dritte param (für ältere, aber manchmal nicht funktioniert) in 4.6 Version von GC.Collect() ist Laufzeit zu sagen, ob Müllsammlung sofort zu tun. In älteren Versionen meldet GC.Collect() nur und lässt die Entscheidung zur Laufzeit.

Für einige Programmiertipps, schlage ich vor, Sie könnten eine Klasse für eine Abfrage umbrechen. Die Klasse könnte explizit nach einer Abfrage angeordnet werden. Es kann helfen, GC intelligenter zu machen.

Schließlich gibt es tatsächlich etwas im .NET Framework, das Sie selbst verwalten müssen. Wie Bitmap.GetHBitmap müssen sie manuell entsorgt werden.

+0

Danke. Ich werde es versuchen und sehen, was passiert. – SeanD