Beste Weg, um zu vermeiden, out-of-memory-Ausnahme in der Anwendung
Entwerfen wir eine Stress-Test-Anwendung, die dann an Masse der HTTP-Anfragen von der Größe von "1 MB", um einen bestimmten Web Service. Erreichen stress, wir sind mit mehreren threads in der Anwendung. Die Struktur ist so etwas wie wir haben X EnqueueThreads die die HTTPRequest-Daten und Sie werden es Ihnen in der Warteschlange. Und die Y-WorkerThreads dequeue Anfragen, die Sie Einreichen wird, um web-service.
Alle Anfragen sind aysnchronous.
Das problem hierbei ist nun, Enqueue-threads arbeiten wesentlich schneller als WorkerThreads also, wenn es keine stop/warten-Bedingung, die Sie hinzufügen, die Anforderungen, bis die out-of-memory-exception geworfen wird und somit der Injektor (wo das Programm ausgeführt werden) langsame.
Derzeit sind wir Umgang mit dem OutOfMemory-Ausnahmen und die enqueuethreads Schlaf für einige Zeit. Eine andere Möglichkeit, die ich denken konnte, beschränken die Größe der Warteschlange.
Aber ich würde gerne wissen, die Ansichten, was sollte der beste Ansatz sein, um das begrenzte system-Ressourcen (speziell Speicher).?
Vielen Dank im Voraus.
InformationsquelleAutor Tejas | 2012-04-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, je nach Thema der Frage, die beste Möglichkeit zur Vermeidung von out-of-memory-Ausnahme wäre, nicht Objekte zu erstellen, fill-in, Speicher.
Handhabung Ausnahme ist die einfachste Lösung, wenn auch vielleicht bringen verschiedene Schwierigkeiten und Inkonsistenzen in der Anwendung mit der Zeit. Ein anderer Weg wäre, die immer verfügbar Größe des Speichers Ressourcen wie diese:
Dann können Sie berechnen die Länge der Warteschlange basierend auf der Schätzung eines Objekts Speicher-Kapazität.
Andere Möglichkeit wäre zu prüfen, für die Speicher-Größe in jeder worker-thread. Wenn es keinen Speicher, der thread kann nur beenden. So viele threads wäre laichen und sterben, aber die Anwendung wäre bei maximal verfügbare Kapazität.
InformationsquelleAutor Dmitry Reznik
Können Sie und sollten wahrscheinlich verwenden Sie die MemoryFailPoint Klasse in einem Szenario wie dieses.
Wenn du eine OutOfMemoryException dann den Status der Anwendung könnte beschädigt sein und Sie sollten nicht versuchen, um sich zu erholen. MemoryFailPoint ist entworfen, um dies zu vermeiden, indem Sie bestimmen, wie viel Sie die Anwendung verlangsamen, so dass Sie können vermeiden, dass der Speicher aus. Lassen Sie den Rahmen bestimmen, ob Sie die operation durchführen und nicht die Einnahme eine Vermutung auf, wie viel Sie "denken" Sie bekommen kann Weg mit, basierend auf wie viel Speicher Ihre Anwendung.
Sollten Sie auch überprüfen Sie Speicher für die Nutzung durch den garbage collector nicht den Prozess, um genau festzustellen, wie viel verwalteten Speicher ist tatsächlich zugewiesen ist. Mit eigenem Speicher Größe wird Ihnen eine viel niedrigere Lesen, und Sie konnten immer noch land in eine out-of-memory-situation, obwohl es scheint, Sie haben viel zu ersparen.
Dem code-Beispiel auf der MSDN-Seite zeigt, wie die Schätzung des Speicherbedarfs für eine operation, und diese Informationen verwenden, um zu warten, bis Speicher verfügbar ist, bevor Sie versuchen, um weitere Anfragen. Wenn Sie bestimmen können, welche Bereiche des Codes, die große Anforderungen an den Arbeitsspeicher ist dies eine gute option zu beschränken und es vermeiden, running out of memory.
InformationsquelleAutor BrutalDev