När inträffar ett OutOfMemonryException? Om vi försöker skapa ett nytt objekt och skräpsamlaren inte kan hitta något ledigt minne, kan vi fånga undantaget; Ett annat fall är att när CLR behöver minne och systemet inte kan tillhandahålla det, kommer undantaget också att kastas. Men just nu kan vår applikation inte upptäcka felet.
Felsökningsanalys av minnesöverflöde (OutOfMemoryException).
Adressutrymmet för det 32-bitars operativsystemet är 4G, där 2G upptas av operativsystemet, vilket innebär att minnet som återstår för användarprocessen endast är 2G (vilket också drar av en del av det utrymme som bilden upptar när programmet laddas, vanligtvis kan endast cirka 1,6G~1,8G användas). Om en process behöver begära minne medan den körs, och operativsystemet inte kan tilldela minnesutrymme till den, kommer den att producera ett out-of-memory-undantag, System.OutOfMemoryException i .net (undantaget som kastas när det inte finns tillräckligt med minne för att fortsätta köra ett program). Även om den slutliga manifestationen är OutOfMemoryException kan orsaken vara annorlunda, och innan detta problem löses är det nödvändigt att analysera processens aktuella minnesanvändningsstatus för att hitta rätt orsak innan rätt medicin ordineras. Här är några tips för att felsöka sådana problem.
För mer information, vänligen se:http://blog.csdn.net/lazyleland/article/details/6704661
iis Application Pool Memory Overflow Error System.OutOfMemoryException
På en ASP.NET webbserver är mängden minne som ASP.NET kan använda vanligtvis inte lika med hela mängden minne. I machine.config-konfigurationsfilen <processModel>finns egenskapen "memoryLimit" i konfigurationssektionen, värdet på denna egenskap är ett procentuellt värde, standardvärdet är "60", det vill säga att den ASP.NET processen (du kan se den ASP.NET processen i aktivitetshanteraren, aspnet_wp i IIS5, w3wp i IIS6) kan använda 60 % av allt fysiskt minne. När mängden minne som används av ASP.NET överskrider denna gräns kommer IIS att börja återvinna processen, det vill säga skapa en ny process för att hantera HTTP-förfrågningar och återta det minne som den gamla processen använde.
När vi har en server med stort minne måste värdet på "memoryLimit" justeras därefter. Till exempel, om vi förbereder en server med chemas-microsoft-com enoughmarttags" />t="on"> 4G-minne, då t="on">4G×60%=t="on">2.4G. För Win32-operativsystem är dock allt minnesutrymme som en process kan uppta endast t="på">2G. När minnet som ASP.NET upptar börjar nå t="on">2G, eftersom det inte når "återvinningströskeln" t="on">2.4G, kommer IIS inte att starta återvinningsprocessen, men på grund av Win32:s begränsningar är det faktiskt omöjligt att tilldela mer minne till denna process, så OutOfMemoryException kommer sannolikt att kastas. För att undvika detta var vi tvungna att minska "memoryLimit" på ett lämpligt sätt så att IIS kunde processa återvinning tidigare.
Microsoft rekommenderar att ASP.NET process tar upp högst 60 % av minnet, och det är bäst att det beräknade faktiska värdet inte är högre än t="on">800M. Med det sagt, för en server med t="on" > 4G-minne är det bäst att sätta egenskapen "memoryLimit" till "20". Att sätta en lämplig återvinningströskel för att IIS ska kunna återvinna processer i rätt tid är mycket viktigt för att säkerställa hela serverns stabila drift och undvika OutOfMemoryException.
I IIS6 bestäms återvinningströskeln för ASP.NET processer inte längre av egenskapen "memoryLimit" i konfigurationssektionen, utan av inställningarna i applikationspoolkonfigurationen i IIS Manager.
Men även om dessa konfigurationer ställs in korrekt finns det ingen garanti för att OutOfMemoryExceptions helt undviks, och orsakerna kan vara varierande och komplexa, såsom att minnesåterställningsoperationer kan vara för tidskrävande. Utvecklare bör alltid komma ihåg att inte använda och slösa minne i onödan i sin kod. :)
Om du har en server med stort minne och är frustrerad över begränsningen att använda t="on" >2G-minne i Win32-operativsystemet, finns det två alternativa lösningar:
- Starta datorn i /3GB-läge och följ länken efter artikeln om metoddeltagande
- Använd Windows Server 2003 64bits Edition
Flera element för att undvika minnesöverflöd
Om du vill skapa en array, se till att den har rätt storlek.
Se till att du har tillräckligt med minne för intern användning och nya hostade objekt.
Om du programmerar på .NET Compact Framework kastar den publika språkets runtime detta undantag när det inte finns tillräckligt med minne för intern användning eller ett nytt hanterat objekt. För att undvika detta undantag bör du undvika att skriva stora metoder som tar upp 64KB eller mer minne.
Överdriven hantering av hanterat minne orsakas ofta av:
- Läs in stora datamängder i minnet.
- Skapar för många cachade poster.
- Ladda upp eller ladda ner stora filer.
- Använd för många reguljära uttryck eller strängar när du analyserar filer.
- Överdriven visningsstatus.
- Det finns för mycket data eller för många sessioner i sessionstillståndet.
- Detta undantag kan aktiveras när en metod anropas på ett COM-objekt och metoden returnerar en användardefinierad typ som innehåller en säker array (en array med obestämda storlekar) med ett tilläggsmeddelande "Inte tillräckligt lagringsutrymme för att slutföra denna operation". Detta beror på att .NET-ramverket inte kan marshalera strukturella fält med säkra arraytyper.
Ett exempel på en minnesöverbelastning orsakad av felaktig användning av bytearrayer
Om utdatafilen är särskilt stor kan den rapportera System.OutOfMemoryException direkt. Det korrekta sättet att göra detta är att mata ut byteströmmen av filen i segment, men det finns asp.net färdig metod Response.WriteFile(filePath) som gör just det.
Följande är det korrekta sättet att skriva:
När en asp.net upplever minnesöverflöd är ett enkelt sätt att hantera det att omedelbart återta applikationspoolen. Men detta löste inte problemet helt.
Minnesöverflöde vid skapande av en bildtyp (System.OutOfMemoryException)
Felkod: System.Drawing.Image myimg=System.Drawing.Image.FromFile(file. FullName);
Undantag som kastas när en öppen fil inte är en bildfil:
MSDN: Denna metod kastar ett OutOfMemoryException-undantag om filen inte har ett giltigt bildformat, eller om GDI+ inte stöder filens pixelformat.
Sådan onormal information är lätt vilseledande.
<processModel> Element
Konfigurera inställningarna för ASP.NET processmodell på Internet Information Services (IIS) webbserver. Sektionen kan endast ställas in i filen Machine.config <processModel> , och den påverkar alla ASP.NET applikationer som körs på servern.
Varning För information om detta element, vänligen läs avsnittet "Anteckningar".
Exempel på att konfigurera strukturen:
exeges
Det hanterade kodkonfigurationssystemet läser inte <processModel> konfigurationsinställningarna. Istället läses den direkt av den ohanterade DLL-aspnet_isapi.dll. Ändringarna i detta avsnitt träder i kraft efter att du startat om IIS.
Om du installerar ASP.NET på en domänkontrollant måste du vidta särskilda åtgärder annars kommer installationen inte att fungera. För mer information, se Lokaliserad ihttp://support.microsoft.comMicrosoft-artikeln i Knowledge Base CHS315158 "ASP.NET kan inte använda standardkontot ASPNET på domänkontroller".
När ASP.NET körs i IIS version 6 native-läge använder den IIS 6-processmodellen och ignorerar <processModel> inställningarna i sektionen. För att konfigurera processidentitet, återvinning eller andra processmodellvärden, använd användargränssnittet för Internet Services Manager för att konfigurera IIS-arbetsprocesser för din applikation.
Tidsvärdet är formaterat som "timmar:minuter:sekunder". Om endast ett enda tal anges utan kolon antas värdet vara minuter; Därför är timeout="4" ekvivalent med timeout="00:04:00".
Om en ASP.NET applikation får ASP.NET arbetsprocesser (Aspnet_wp.exe på Windows 2000 och Windows XP Professional samt W3wp.exe på Windows Server 2003) att starta om och ger ett felmeddelande som indikerar att omstarten beror på ett misstänkt deadlock-tillstånd, bör det öka responseDeadlockInterval-inställning.
Spara användarnamn och lösenord i registret
Spara användarnamn och lösenord i registret
För att kryptera användarnamn och lösenord och lagra dem i registret, ställ in användarnamn och lösenord enligt följande.
userName="registry:HKLM\Software\AspNetProcess,Name"
password="registry:HKLM\Software\AspNetProcess,Pwd"
Den del av strängen som kommer efter nyckelordsregistret och före kommatecknet anger namnet på registreringsnyckeln som ASP.NET öppnas. Delen efter kommatecknet innehåller ett strängvärdesnamn från vilket ASP.NET läser referenserna. Kommatecken krävs och uppgifter måste lagras i HKLM:s konfigurationsenhet. Om konfigurationen är felformaterad kommer ASP.NET inte att starta arbetsprocessen utan kommer därefter att dyka upp i vägen för felkoden för aktuellt kontoskapande.
Inloggningsuppgifterna måste vara i REG_BINARY format och innehålla utdata från ett anrop till Windows API-funktionen CryptProtectData. Du kan skapa och lagra krypteringsuppgifter i registret med applikationen ASP.NET Settings Registry Console (Aspnet_setreg.exe), som använder CryptProtectData för att slutföra krypteringen. För att ladda ner källkoden till Aspnet_setreg.exe och Visual C++ och hjälp, besök webbplatsenwww.asp.netoch sök efter "aspnet_setreg".
Du bör konfigurera åtkomst till registernycklarna som lagrar krypterade inloggningsuppgifter så att åtkomsten endast är tillgänglig för administratörer och SYSTEM. Eftersom registernyckeln kommer att läsas av den ASP.NET processen som körs som SYSTEM, bör du ställa in följande behörigheter:
Administrators:F
SYSTEM:F
SKAPARÄGARE:F
ProcessAccount:R
Detta kommer att ge två försvarslinjer för att skydda data:
ACL-behörigheter kräver åtkomst till data med administratörens identitet. Angriparen måste köra kod (CryptUnprotectData) på servern för att återställa kontots inloggningsuppgifter.
exempel
Följande exempel specificerar flera <processModel> konfigurationsinställningar.
Följande exempel specificerar att det krypterade användarnamnet och lösenordet lagras under det användardefinierade registerobjektet AspNetProcess.
Krav
- Inkluderat i: <system.web>
- Webbplattform: IIS 5.0, IIS 5.1, IIS 6.0
- Konfigurationsfiler: Machine.config, Web.config
- Konfigurationssektionshanterare: System.Web.Configuration.ProcessModelConfigurationHandler
http://doc.51windows.net/iismmc/ ... essmodelelement.htm
|