Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 24448|Antwoord: 0

[Bron] . Netto geheugenoverloop (System.OutOfMemoryException).

[Link kopiëren]
Geplaatst op 14-03-2019 21:47:39 | | | |
Wanneer vindt een OutOfMemonryException plaats? Als we proberen een nieuw object aan te maken en de garbage collector kan geen vrij geheugen vinden, kunnen we de uitzondering vangen; Een ander geval is dat wanneer de CLR geheugen nodig heeft en het systeem het niet kan leveren, de uitzondering ook wordt gegooid. Maar op dit moment kan onze applicatie de fout niet ontdekken.

Debuganalyse van geheugenoverloop (OutOfMemoryException).

De adresseringsruimte van het 32-bits besturingssysteem is 4G, waarvan 2G wordt ingenomen door het besturingssysteem, wat betekent dat het geheugen dat overblijft voor het gebruikersproces slechts 2G is (wat ook een deel van de ruimte aftrekt die door de image wordt ingenomen wanneer het programma wordt geladen, meestal kan slechts ongeveer 1,6G~1,8G worden gebruikt). Als een proces geheugen moet opvragen terwijl het draait, en het besturingssysteem kan er geen geheugenruimte aan toewijzen, zal het een out-of-memory-uitzondering produceren, System.OutOfMemoryException in .net (De uitzondering die wordt gegooid wanneer er niet genoeg geheugen is om de uitvoering van een programma voort te zetten). Hoewel de uiteindelijke manifestatie OutOfMemoryException is, kan de oorzaak anders zijn, en voordat dit probleem wordt opgelost, is het noodzakelijk om de huidige geheugengebruiksstatus van het proces te analyseren om de juiste oorzaak te vinden voordat het juiste medicijn wordt voorgeschreven. Hier zijn enkele tips om zulke problemen te debuggen.

Voor meer informatie, verwijs naar:http://blog.csdn.net/lazyleland/article/details/6704661

iis Application Pool Memory Overflow Error System.OutOfMemoryException

Op een ASP.NET webserver is de hoeveelheid geheugen die ASP.NET kunt gebruiken meestal niet gelijk aan alle hoeveelheid geheugen. In het configuratiebestand machine.config <processModel>is er een eigenschap "memoryLimit" in het configuratiegedeelte, de waarde van deze eigenschap is een procentuele waarde, de standaard is "60", dat wil zeggen, het ASP.NET proces (je kunt het ASP.NET proces in taakbeheer zien, aspnet_wp in IIS5, w3wp in IIS6) kan 60% van al het fysieke geheugen gebruiken. Wanneer de hoeveelheid geheugen die ASP.NET gebruikt deze limiet overschrijdt, begint IIS automatisch het proces te recyclen, dat wil zeggen, het creëren van een nieuw proces om HTTP-verzoeken af te handelen en het geheugen dat door het oude proces werd gebruikt terug te winnen.

Wanneer we een server hebben met een groot geheugen, moet de waarde van "memoryLimit" passend worden aangepast. Als we bijvoorbeeld een server voorbereiden met chemas-microsoft-com voldoende marttags" />t="on"> 4G-geheugen, dan t="on">4G×60%=t="on">2.4G. Voor Win32-besturingssystemen is echter alle geheugenruimte die een proces kan innemen slechts t="on">2G. Wanneer het geheugen dat door het ASP.NET proces wordt gebruikt begint te bereiken t="on">2G, omdat het niet de "recyclingdrempel" van t="on">2.4G bereikt, zal IIS de recyclingprocesoperatie niet starten, maar door de beperkingen van Win32 is het eigenlijk onmogelijk om meer geheugen aan dit proces toe te wijzen, dus de OutOfMemoryException zal waarschijnlijk worden gegooid. Om dit te voorkomen moesten we de "memoryLimit" passend verlagen zodat IIS eerder recycle kon verwerken.

Microsoft raadt aan dat ASP.NET proces niet meer dan 60% van het geheugen inneemt, en het is het beste om de berekende werkelijke waarde niet hoger te maken dan t="on">800M. Dat gezegd hebbende, voor een server met t="on" > 4G-geheugen, is het het beste om de eigenschap "memoryLimit" op "20" te zetten. Het instellen van een passende recyclingdrempel voor IIS om processen tijdig te recyclen is erg belangrijk om de stabiele werking van de gehele server te waarborgen en OutOfMemoryException te voorkomen.

In IIS6 wordt de recyclingdrempel voor ASP.NET processen niet langer bepaald door de eigenschap "memoryLimit" in het configuratiegedeelte, maar door de instellingen in de applicatiepoolconfiguratie in IIS Manager.

Zelfs als deze configuraties correct zijn ingesteld, is er echter geen garantie dat OutOfMemoryExceptions volledig worden vermeden, en de redenen kunnen gevarieerd en complex zijn, zoals geheugenhersteloperaties die te tijdrovend kunnen zijn. Ontwikkelaars moeten er altijd rekening mee houden om geen geheugen onnodig te gebruiken en te verspillen aan hun code. :)

Als je een server hebt met veel geheugen en gefrustreerd bent door de beperking van het gebruik van t="on" >2G-geheugen in het Win32-besturingssysteem, zijn er twee alternatieve oplossingen:

  • Start de computer in /3GB-modus en volg de link na het artikel over methode-participatie
  • Gebruik Windows Server 2003 64bits Edition


Verschillende elementen om geheugenoverloop te voorkomen

Als je een array wilt maken, zorg dan dat deze de juiste grootte heeft.

Zorg dat je genoeg geheugen hebt voor intern gebruik en nieuwe gehoste objecten.

Als je programmeert op het .NET Compact Framework, gooit de public language runtime deze uitzondering wanneer er niet genoeg geheugen is voor intern gebruik of een nieuw beheerd object. Om deze uitzondering te vermijden, moet je het schrijven van grote methoden die 64KB of meer geheugen innemen.

Overmatig beheer van geheugen wordt vaak veroorzaakt door:

  • Lees grote datasets in het geheugen.
  • Te veel gecachte vermeldingen aanmaken.
  • Upload of download grote bestanden.
  • Gebruik te veel reguliere expressies of strings bij het analyseren van bestanden.
  • Overmatige weergavestatus.
  • Er is te veel data of te veel sessies in de sessietoestand.
  • Deze uitzondering kan worden opgeroepen wanneer een methode wordt aangeroepen op een COM-object en de methode een door de gebruiker gedefinieerd type teruggeeft dat een veilige array bevat (een array van onbepaalde groottes) met een extra melding "Niet genoeg opslagruimte om deze bewerking te voltooien". Dit komt doordat het .NET Framework structurele velden niet kan samenbrengen met veilige arraytypes.


Een voorbeeld van een geheugenoverloop veroorzaakt door onjuist gebruik van byte-arrays


Als het uitvoerbestand bijzonder groot is, kan het direct System.OutOfMemoryException rapporteren. De juiste manier om dit te doen is door de bytestroom van het bestand in segmenten uit te geven, maar er is asp.net kant-en-klare methode Response.WriteFile(filePath) die precies dat doet.

De volgende is de juiste manier van schrijven:

Wanneer een asp.net geheugenoverloop ervaart, is een eenvoudige manier om dit aan te pakken het applicatiebestand direct terug te winnen. Maar dit loste het probleem niet volledig op.

Geheugenoverloop bij het aanmaken van een afbeeldingstype (System.OutOfMemoryException)

Foutcode: System.Drawing.Image myimg=System.Drawing.Image.FromFile(file. VolNaam);

Uitzonderingen die worden gegooid wanneer een open bestand geen imagebestand is:



MSDN: Deze methode gooit een OutOfMemoryException-uitzondering als het bestand geen geldig afbeeldingsformaat heeft, of als GDI+ het pixelformaat van het bestand niet ondersteunt.

Dergelijke abnormale informatie is gemakkelijk misleidend.

<processModel> Element

Configureer de ASP.NET procesmodelinstellingen op de Internet Information Services (IIS) webserver. De sectie kan alleen worden ingesteld in het Machine.config-bestand <processModel> , en het beïnvloedt alle ASP.NET applicaties die op de server draaien.

Waarschuwing Voor informatie over dit element, lees de sectie "Notities".

Voorbeeld van het configureren van de structuur:

exegese

Het beheerde codeconfiguratiesysteem <processModel> leest de configuratie-instellingen niet. In plaats daarvan wordt het direct gelezen door de onbeheerde DLL-aspnet_isapi.dll. De wijzigingen in deze sectie gaan in nadat je IIS opnieuw hebt herstart.

Als je ASP.NET op een domeincontroller installeert, moet je speciale stappen ondernemen, anders werkt de installatie niet. Voor meer informatie, zie Gevonden inhttp://support.microsoft.comHet Microsoft-artikel in de Knowledge Base CHS315158 "ASP.NET kunt het standaard ASPNET-account niet gebruiken op domeincontrollers".

Wanneer ASP.NET draait in IIS versie 6 native modus, gebruikt het het IIS 6 procesmodel en negeert <processModel> het de instellingen in de sectie. Om procesidentiteit, recycling of andere procesmodelwaarden te configureren, gebruik je de gebruikersinterface van Internet Services Manager om IIS-werkprocessen voor je applicatie te configureren.

De tijdswaarde is geformatteerd als "uren:minuten:seconden". Als slechts één getal zonder dubbele punt wordt gegeven, wordt aangenomen dat de waarde minuten is; Daarom is timeout="4" gelijk aan timeout="00:04:00".

Als een ASP.NET applicatie ervoor zorgt dat ASP.NET workerprocessen (Aspnet_wp.exe op Windows 2000 en Windows XP Professional en W3wp.exe op Windows Server 2003) opnieuw starten en een foutmelding geeft dat de herstart te wijten is aan een vermoedelijke deadlock, zou deze moeten toenemen responseDeadlockInterval-instelling.

Bewaar gebruikersnamen en wachtwoorden in het register

Bewaar gebruikersnamen en wachtwoorden in het register

Om gebruikersnamen en wachtwoorden te versleutelen en op te slaan in het register, stel je de gebruikersnaam en het wachtwoord als volgt in.

userName="registry:HKLM\Software\AspNetProcess,Name"

password="registry:HKLM\Software\AspNetProcess,Pwd"

Het deel van de string dat na het zoekwoordregister en vóór de komma komt, geeft de naam aan van de registersleutel die ASP.NET opent. Het deel na de komma bevat een stringwaarde naam waarvan de ASP.NET de referenties zal lezen. Komma's zijn vereist en inloggegevens moeten worden opgeslagen in de HKLM-configuratie-eenheid. Als de configuratie verkeerd is geformatteerd, start ASP.NET het worker-proces niet en verschijnt vervolgens in het pad van de foutcode voor het aanmaken van het huidige account.

De inloggegevens moeten in REG_BINARY formaat zijn en de output bevatten van een aanroep naar de Windows API-functie CryptProtectData. Je kunt encryptiegegevens aanmaken en opslaan in het register met de ASP.NET Settings Registry Console-applicatie (Aspnet_setreg.exe), die CryptProtectData gebruikt om de versleuteling te voltooien. Om Aspnet_setreg.exe en Visual C++ broncode en hulp te downloaden, bezoek de websitewww.asp.neten zoek op "aspnet_setreg".

Je moet toegang configureren tot de registersleutels die versleutelde inloggegevens opslaan, zodat toegang alleen beschikbaar is voor beheerders en SYSTEEM. Omdat de registersleutel wordt gelezen door het ASP.NET proces dat als SYSTEM draait, moet je de volgende rechten instellen:

Administrators:F

SYSTEM:F

CREATOR OWNER: F

ProcessAccount:R

Dit zal twee verdedigingslijnen bieden om data te beschermen:

ACL-rechten vereisen toegang tot gegevens met de identiteit van Administrator.
De aanvaller zou code (CryptUnprotectData) op de server moeten uitvoeren om de inloggegevens van het account te herstellen.

voorbeeld

Het volgende voorbeeld specificeert verschillende <processModel> configuratie-instellingen.

Het volgende voorbeeld specificeert dat de versleutelde gebruikersnaam en het wachtwoord worden opgeslagen onder het door de gebruiker gedefinieerde register AspNetProcess.

Vereisten

  • Opgenomen in: <system.web>
  • Webplatform: IIS 5.0, IIS 5.1, IIS 6.0
  • Configuratiebestanden: Machine.config, Web.config
  • Configuratiesectie-handler: System.Web.Configuration.ProcessModelConfigurationHandler


http://doc.51windows.net/iismmc/ ... essmodelelement.htm





Vorig:C# bepaalt of het geüploade bestand een afbeelding is en voorkomt uploads van Trojaans paard
Volgend:C-taal e-boek collectie delen
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com