|
|
Veröffentlicht am 14.03.2019 21:47:39
|
|
|
|

Wann tritt eine OutOfMemonry-Ausnahme auf? Wenn wir versuchen, ein neues Objekt zu erstellen und der Garbage Collector keinen freien Speicher findet, können wir die Ausnahme fangen; Ein weiterer Fall ist, dass die Ausnahme geworfen wird, wenn die CLR Speicher benötigt und das System ihn nicht bereitstellen kann. Aber im Moment kann unsere Anwendung den Fehler nicht erkennen.
Debug-Analyse des Speicherüberlaufs (OutOfMemoryException).
Der Adressraum des 32-Bit-Betriebssystems ist 4G, wobei 2G vom Betriebssystem belegt wird, was bedeutet, dass der für den Benutzerprozess verbleibende Speicher nur 2G umfasst (was auch einen Teil des Speichers abzieht, der beim Laden des Programms vom Bild belegt wird; in der Regel können nur etwa 1,6G~1,8G verwendet werden). Wenn ein Prozess während der Ausführung Speicher anfordern muss und das Betriebssystem ihm keinen Speicherplatz zuweisen kann, erzeugt er eine Out-of-Memory-Ausnahme, System.OutOfMemoryException in .net (die Ausnahme, die ausgelöst wird, wenn nicht genug Speicher vorhanden ist, um die Ausführung eines Programms fortzusetzen). Obwohl die endgültige Manifestation OutOfMemoryException ist, kann die Ursache unterschiedlich sein, und bevor dieses Problem gelöst wird, ist es notwendig, den aktuellen Speicherverbrauchsstatus des Prozesses zu analysieren, um die korrekte Ursache zu finden, bevor das richtige Medikament verschrieben wird. Hier sind einige Tipps zum Debuggen solcher Probleme.
Weitere Informationen finden Sie bitte:http://blog.csdn.net/lazyleland/article/details/6704661
iis Application Pool Memory Overflow Error System.OutOfMemoryException
Auf einem ASP.NET Webserver ist die Speichermenge, die ASP.NET nutzen können, in der Regel nicht gleich der gesamten Speichermenge. In der machine.config-Konfigurationsdatei <processModel>gibt es im Konfigurationsbereich die Eigenschaft "memoryLimit", der Wert dieser Eigenschaft ist ein Prozentwert, der Standard ist "60", das heißt, der ASP.NET Prozess (du kannst den ASP.NET Prozess im Task-Manager sehen, aspnet_wp in IIS5, w3wp in IIS6) kann 60 % des gesamten physischen Speichers verwenden. Wenn die von ASP.NET benötigte Speichermenge diese Grenze überschreitet, beginnt IIS automatisch, den Prozess zu recyceln, das heißt, einen neuen Prozess zu erstellen, um HTTP-Anfragen zu bearbeiten und den vom alten Prozess belegten Speicher zurückzugewinnen.
Wenn wir einen Server mit großem Speicher haben, muss der Wert von "memoryLimit" entsprechend angepasst werden. Wenn wir zum Beispiel einen Server mit chemas-microsoft-com fügst marttags" />t="on"> 4G-Speicher vorbereiten, dann t="on">4G×60%=t="on">2.4G. Für Win32-Betriebssysteme ist jedoch der gesamte Speicherplatz, den ein Prozess belegen kann, nur t="on">2G. Wenn der vom ASP.NET Prozess belegten Speicher beginnt, t="on">2G zu erreichen, weil er die "Recycling-Schwelle" von t="on">2.4G nicht erreicht, startet IIS den Recycling-Prozess nicht, aber aufgrund der Einschränkungen von Win32 ist es tatsächlich unmöglich, diesem Prozess mehr Speicher zuzuweisen, sodass die OutOfMemoryException wahrscheinlich geworfen wird. Um dies zu vermeiden, mussten wir das "memoryLimit" entsprechend reduzieren, damit IIS früher Recycling verarbeiten konnte.
Microsoft empfiehlt, dass ASP.NET Prozess nicht mehr als 60 % des Speichers belegt, und es ist am besten, den berechneten tatsächlichen Wert nicht mehr als t="on">800M anzugeben. Allerdings ist es für einen Server mit t="on" > 4G-Speicher am besten, die Eigenschaft "memoryLimit" auf "20" zu setzen. Es ist sehr wichtig, einen angemessenen Recycling-Schwellenwert für IIS festzulegen, um Prozesse zeitnah zu recyceln, um den stabilen Betrieb des gesamten Servers sicherzustellen und OutOfMemoryException zu vermeiden.
In IIS6 wird der Recycling-Schwellenwert für ASP.NET Prozesse nicht mehr durch die Eigenschaft "memoryLimit" im Konfigurationsabschnitt bestimmt, sondern durch die Einstellungen in der Anwendungspool-Konfiguration im IIS Manager.
Selbst wenn diese Konfigurationen korrekt eingestellt sind, gibt es jedoch keine Garantie, dass OutOfMemoryExceptions vollständig vermieden werden, und die Gründe können vielfältig und komplex sein, wie etwa dass Speicherrückgewinnungsoperationen zu zeitaufwendig sein könnten. Entwickler sollten immer darauf achten, ihren Code nicht unnötig zu verwenden und Speicher zu verschwenden. :)
Wenn Sie einen Server mit großem Speicher haben und frustriert über die Begrenzung der Verwendung von t="on" >2G-Speicher im Win32-Betriebssystem, gibt es zwei alternative Lösungen:
- Starte den Computer im /3GB-Modus und folge dem Link nach dem Artikel zur Methodenbeteiligung
- Verwenden Sie Windows Server 2003 64bits Edition
Mehrere Elemente zur Vermeidung von Speicherüberlauf
Wenn du ein Array erstellen willst, stelle sicher, dass es die richtige Größe hat.
Stelle sicher, dass du genug Speicher für den internen Gebrauch und neue gehostete Objekte hast.
Wenn du auf dem .NET Compact Framework programmierst, wirft die Public-Language-Laufzeit diese Ausnahme aus, wenn nicht genug Speicher für interne Nutzung oder ein neues verwaltetes Objekt vorhanden ist. Um diese Ausnahme zu vermeiden, solltest du große Methoden nicht schreiben, die 64 KB oder mehr Speicher beanspruchen.
Übermäßiger Managed Memory-Verbrauch wird häufig verursacht durch:
- Lesen Sie große Datensätze in den Speicher.
- Zu viele zwischengespeicherte Einträge erstellen.
- Laden Sie große Dateien hoch oder herunterladen.
- Verwenden Sie zu viele reguläre Ausdrücke oder Zeichenketten bei der Analyse von Dateien.
- Übermäßiger Aufrufstatus.
- Es gibt zu viele Daten oder zu viele Sitzungen im Sitzungszustand.
- Diese Ausnahme kann ausgelöst werden, wenn eine Methode auf einem COM-Objekt aufgerufen wird und die Methode einen benutzerdefinierten Typ zurückgibt, der ein sicheres Array (ein Array unbestimmter Größen) enthält, mit der zusätzlichen Nachricht "Nicht genug Speicherplatz zur Durchführung dieser Operation". Dies liegt daran, dass das .NET Framework keine strukturellen Felder mit sicheren Array-Typen marshallen kann.
Ein Beispiel für einen Speicherüberlauf, der durch unsachgemäße Verwendung von Byte-Arrays verursacht wird
Wenn die Ausgabedatei besonders groß ist, kann sie System.OutOfMemoryException direkt melden. Die richtige Methode ist, den Bytestream der Datei in Segmenten auszugeben, aber es gibt asp.net fertige Methode Response.WriteFile(filePath), die genau das tut.
Im Folgenden ist die korrekte Schreibweise:
Wenn ein asp.net einen Speicherüberlauf erlebt, ist eine einfache Möglichkeit, damit umzugehen, den Anwendungspool sofort zurückzugewinnen. Doch das löste das Problem nicht vollständig.
Speicherüberlauf beim Erstellen eines Image-Typs (System.OutOfMemoryException)
Fehlercode: System.Drawing.Image myimg=System.Drawing.Image.FromFile(file. FullName);
Ausnahmen, die geworfen werden, wenn eine offene Datei keine Image-Datei ist:
MSDN: Diese Methode wirft eine OutOfMemoryException-Ausnahme aus, wenn die Datei kein gültiges Bildformat hat oder GDI+ das Pixelformat der Datei nicht unterstützt.
Solche abnormalen Informationen sind leicht irreführend.
<processModel> Element
Konfigurieren Sie die Einstellungen des ASP.NET Prozessmodells auf dem Internet Information Services (IIS) Webserver. Dieser Abschnitt kann nur in der Datei Machine.config eingestellt werden <processModel> und betrifft alle ASP.NET Anwendungen, die auf dem Server laufen.
Warnung Für Informationen zu diesem Element lesen Sie bitte den Abschnitt "Anmerkungen".
Beispiel für die Konfiguration der Struktur:
Exegese
Das Managed-Code-Konfigurationssystem liest <processModel> die Konfigurationseinstellungen nicht. Stattdessen wird es direkt vom unmanaged DLL aspnet_isapi.dll gelesen. Die Änderungen in diesem Abschnitt treten nach einem Neustart von IIS in Kraft.
Wenn Sie ASP.NET auf einem Domänencontroller installieren, müssen Sie besondere Maßnahmen ergreifen, sonst funktioniert die Installation nicht. Weitere Informationen finden Sie unter Lokalisiert inhttp://support.microsoft.comDer Microsoft-Artikel in der Knowledge Base CHS315158 "ASP.NET kann das Standard-ASPNET-Konto auf Domänencontrollern nicht verwenden".
Wenn ASP.NET im nativen IIS-Version-6-Modus läuft, verwendet es das IIS-6-Prozessmodell und <processModel> ignoriert die Einstellungen in diesem Abschnitt. Um Prozessidentität, Recycling oder andere Prozessmodellwerte zu konfigurieren, verwenden Sie die Benutzeroberfläche des Internet Services Manager, um IIS-Arbeitsprozesse für Ihre Anwendung zu konfigurieren.
Der Zeitwert ist als "Stunden:Minuten:Sekunden" formatiert. Wird nur eine einzelne Zahl ohne Doppelpunkt angegeben, wird der Wert als Minuten angenommen; Daher ist Timeout="4" gleichbedeutend mit Timeout="00:04:00".
Wenn eine ASP.NET Anwendung dazu führt, dass ASP.NET Worker-Prozesse (Aspnet_wp.exe auf Windows 2000 und Windows XP Professional sowie W3wp.exe auf Windows Server 2003) neu starten und eine Fehlermeldung ausgibt, die darauf hinweist, dass der Neustart auf einen vermuteten Deadlock-Zustand zurückzuführen ist, sollte dieser Anstieg responseDeadlockInterval-Einstellung.
Speichern Sie Benutzernamen und Passwörter im Register
Speichern Sie Benutzernamen und Passwörter im Register
Um Benutzernamen und Passwörter zu verschlüsseln und im Register zu speichern, setzen Sie BenutzerName und Passwort wie folgt.
userName="registry:HKLM\Software\AspNetProcess,Name"
password="registry:HKLM\Software\AspNetProcess,Pwd"
Der Teil des Strings, der nach der Schlüsselwortregistrierung und vor dem Komma kommt, zeigt den Namen des geöffneten ASP.NET Registrierungsschlüssels an. Der Teil nach dem Komma enthält einen Zeichenzeichen-Wertnamen, von dem der ASP.NET die Zugangsdaten ausliest. Kommas sind erforderlich und Zugangsdaten müssen in der HKLM-Konfigurationseinheit gespeichert werden. Wenn die Konfiguration falsch formatiert ist, startet ASP.NET den Worker-Prozess nicht und erscheint anschließend im Pfad des Fehlercodes zur aktuellen Kontoerstellung.
Die Zugangsdaten müssen im REG_BINARY Format liegen und die Ausgabe eines Aufrufs der Windows-API-Funktion CryptProtectData enthalten. Sie können Verschlüsselungsdaten in der Registry mit der ASP.NET Settings Registry Console (Aspnet_setreg.exe) erstellen, die CryptProtectData zur Verschlüsselung verwendet. Um Aspnet_setreg.exe und Visual C++-Quellcode herunterzuladen und Hilfe zu erhalten, besuchen Sie die Websitewww.asp.netund suche nach "aspnet_setreg".
Du solltest den Zugriff auf die Registerschlüssel konfigurieren, die verschlüsselte Zugangsdaten speichern, sodass der Zugriff nur Administratoren und SYSTEM verfügbar ist. Da der Registrierungsschlüssel vom ASP.NET als SYSTEM laufenden Prozess gelesen wird, sollten Sie folgende Berechtigungen festlegen:
Administrators:F
SYSTEM:F
CREATOR OWNER:F
ProcessAccount:R
Dies bietet zwei Verteidigungslinien zum Schutz der Daten:
ACL-Berechtigungen erfordern Zugriff auf Daten mit der Identität des Administrators. Der Angreifer müsste Code (CryptUnprotectData) auf dem Server ausführen, um die Zugangsdaten des Kontos wiederherzustellen.
Beispiel
Das folgende Beispiel beschreibt mehrere <processModel> Konfigurationseinstellungen.
Das folgende Beispiel spezifiziert, dass der verschlüsselte Benutzername und das Passwort unter dem benutzerdefinierten Registry AspNetProcess gespeichert werden.
Anforderungen
- Enthalten in: <system.web>
- Webplattform: IIS 5.0, IIS 5.1, IIS 6.0
- Konfigurationsdateien: Machine.config, Web.config
- Konfigurationsabschnittshandler: System.Web.Configuration.ProcessModelConfigurationHandler
http://doc.51windows.net/iismmc/ ... essmodelelement.htm
|
Vorhergehend:C# bestimmt, ob die hochgeladene Datei ein Bild ist, und verhindert das Hochladen von Trojanischen PferdenNächster:C-Language-E-Book-Sammlungsaustausch
|