|
|
Opslået på 14/03/2019 21.47.39
|
|
|
|

Hvornår opstår en OutOfMemonryException? Hvis vi prøver at oprette et nyt objekt, og garbage collectoren ikke kan finde nogen ledig hukommelse, kan vi fange undtagelsen; Et andet tilfælde er, at når CLR har brug for hukommelse, og systemet ikke kan levere det, vil undtagelsen også blive kastet. Men på nuværende tidspunkt kan vores applikation ikke fange fejlen.
Debug-analyse af hukommelsesoverløb (OutOfMemoryException).
Adresseringsområdet for det 32-bit operativsystem er 4G, hvoraf 2G er optaget af operativsystemet, hvilket betyder, at den hukommelse, der er tilbage til brugerprocessen, kun er 2G (hvilket også trækker en del af den plads, billedet optager, når programmet indlæses, generelt kan kun omkring 1,6G~1,8G bruges). Hvis en proces har brug for at anmode om hukommelse, mens den kører, og operativsystemet ikke kan tildele hukommelsesplads til den, vil den producere en out-of-memory-undtagelse, System.OutOfMemoryException i .net (den undtagelse, der kastes, når der ikke er nok hukommelse til at fortsætte udførelsen af et program). Selvom den endelige manifestation er OutOfMemoryException, kan årsagen være anderledes, og før dette problem løses, er det nødvendigt at analysere processens aktuelle hukommelsesforbrugsstatus for at finde den korrekte årsag, før den rette medicin ordineres. Her er nogle tips til at fejlfinde sådanne problemer.
For mere information, henvises til:http://blog.csdn.net/lazyleland/article/details/6704661
iis Application Pool Memory Overflow Error System.OutOfMemoryException
På en ASP.NET webserver er mængden af hukommelse, ASP.NET kan bruge, normalt ikke lig med hele mængden af hukommelse. I konfigurationsfilen machine.config <processModel>findes der egenskaben "memoryLimit" i konfigurationssektionen, værdien af denne egenskab er en procentdel, standardværdien er "60", det vil sige, at den ASP.NET proces (du kan se ASP.NET-processen i jobmanageren, aspnet_wp i IIS5, w3wp i IIS6) kan bruge 60% af al fysisk hukommelse. Når mængden af hukommelse, som ASP.NET bruger, overstiger denne grænse, vil IIS begynde automatisk at genbruge processen, det vil sige at oprette en ny proces til at håndtere HTTP-anmodninger og genvinde den hukommelse, der blev optaget af den gamle proces.
Når vi har en server med stor hukommelse, skal værdien af "memoryLimit" justeres passende. For eksempel, hvis vi forbereder en server med chemas-microsoft-com tilstrækkeligt marttags" />t="on"> 4G-hukommelse, så t="on">4G×60%=t="on">2.4G. Men for Win32-operativsystemer er al den hukommelsesplads, en proces kan optage, kun t="on">2G. Når hukommelsen, som ASP.NET-processen optager, begynder at nå t="on">2G, fordi den ikke når "genbrugstærsklen" t="on">2.4G, vil IIS ikke starte genbrugsprocessen, men på grund af begrænsningerne i Win32 er det faktisk umuligt at allokere mere hukommelse til denne proces, så OutOfMemoryException vil sandsynligvis blive kastet. For at undgå dette måtte vi reducere "memoryLimit" passende, så IIS kunne behandle genbrug tidligere.
Microsoft anbefaler, at ASP.NET proces ikke optager mere end 60% af hukommelsen, og det er bedst at gøre den beregnede faktiske værdi højst t="on">800M. Når det er sagt, for en server med t="on" > 4G-hukommelse, er det bedst at sætte "memoryLimit"-egenskaben til "20". At fastsætte en passende genanvendelsestærskel for IIS til at genanvende processer rettidigt er meget vigtigt for at sikre hele serverens stabile drift og undgå OutOfMemoryException.
I IIS6 bestemmes genanvendelsestærsklen for ASP.NET processer ikke længere af egenskaben "memoryLimit" i konfigurationssektionen, men af indstillingerne i applikationspoolkonfigurationen i IIS Manager.
Men selv hvis disse konfigurationer er korrekt sat, er der ingen garanti for, at OutOfMemoryExceptions helt undgås, og årsagerne kan være varierende og komplekse, såsom at hukommelsesgenvindingsoperationer kan være for tidskrævende. Udviklere bør altid huske ikke at bruge og spilde hukommelse unødvendigt i deres kode. :)
Hvis du har en server med stor hukommelse og er frustreret over begrænsningen ved at bruge t="on" >2G-hukommelse i Win32-operativsystemet, findes der to alternative løsninger:
- Start computeren i /3GB-tilstand, og følg linket efter metoden deltager-artiklen
- Brug Windows Server 2003 64bits Edition
Flere elementer for at undgå hukommelsesoverløb
Hvis du vil lave et array, skal du sikre dig, at det har den rigtige størrelse.
Sørg for, at du har nok hukommelse til intern brug og nye hostede objekter.
Hvis du programmerer på .NET Compact Framework, kaster public language runtime denne undtagelse, når der ikke er nok hukommelse til intern brug eller et nyt managed object. For at undgå denne undtagelse bør du undgå at skrive store metoder, der optager 64KB eller mere hukommelse.
Overdreven håndtering af styret hukommelse skyldes ofte:
- Læs store datasæt ind i hukommelsen.
- At skabe for mange cachede indførsler.
- Upload eller download store filer.
- Brug for mange regulære udtryk eller strenge, når du analyserer filer.
- Overdreven visningsstatus.
- Der er for mange data eller for mange sessioner i sessionstilstanden.
- Denne undtagelse kan aktiveres, når en metode kaldes på et COM-objekt, og metoden returnerer en brugerdefineret type, der indeholder et sikkert array (et array med ubestemte størrelser) med en ekstra besked "Ikke nok lagerplads til at fuldføre denne operation". Dette skyldes, at .NET Framework ikke kan marshale strukturelle felter med sikre array-typer.
Et eksempel på et hukommelsesoverløb forårsaget af forkert brug af byte-arrays
Hvis outputfilen er særligt stor, kan den direkte rapportere System.OutOfMemoryException. Den korrekte måde at gøre dette på er at outputte filens bytestrøm i segmenter, men der findes asp.net færdiglavet metode Response.WriteFile(filePath), som gør netop det.
Følgende er den korrekte måde at skrive på:
Når en asp.net oplever hukommelsesoverløb, er en nem måde at håndtere det på at genvinde applikationspuljen med det samme. Men dette løste ikke problemet fuldstændigt.
Hukommelsesoverløb ved oprettelse af en billedtype (System.OutOfMemoryException)
Fejlkode: System.Drawing.Image myimg=System.Drawing.Image.FromFile(file. FuldNavn);
Undtagelser, der kastes, når en åben fil ikke er en billedfil:
MSDN: Denne metode kaster en OutOfMemoryException-undtagelse, hvis filen ikke har et gyldigt billedformat, eller hvis GDI+ ikke understøtter filens pixelformat.
Sådan unormal information er let vildledende.
<processModel> Element
Konfigurer ASP.NET procesmodelindstillinger på Internet Information Services (IIS) webserveren. Sektionen kan kun sættes i <processModel> Machine.config-filen, og den påvirker alle ASP.NET applikationer, der kører på serveren.
Advarsel For information om dette element, læs venligst afsnittet "Noter".
Eksempel på konfiguration af strukturen:
Eksegese
Det styrede kodekonfigurationssystem læser ikke <processModel> konfigurationsindstillingerne. I stedet læses den direkte af den uadministrerede DLL-aspnet_isapi.dll. Ændringerne i dette afsnit træder i kraft, når du genstarter IIS.
Hvis du installerer ASP.NET på en domænecontroller, skal du tage særlige skridt, ellers vil installationen ikke virke. For mere information, se Placeret ihttp://support.microsoft.comMicrosoft-artiklen i Knowledge Base CHS315158 "ASP.NET kan ikke bruge standard ASPNET-kontoen på domænecontrollere".
Når ASP.NET kører i IIS version 6 native tilstand, bruger den IIS 6 procesmodellen og <processModel> ignorerer indstillingerne i sektionen. For at konfigurere procesidentitet, genbrug eller andre procesmodelværdier skal du bruge Internet Services Manager-brugergrænsefladen til at konfigurere IIS-arbejdsprocesser til din applikation.
Tidsværdien er formateret som "timer:minutter:sekunder". Hvis kun ét tal gives uden kolon, antages værdien at være minutter; Derfor svarer timeout="4" til timeout="00:04:00".
Hvis et ASP.NET program får ASP.NET arbejdsprocesser (Aspnet_wp.exe på Windows 2000 og Windows XP Professional samt W3wp.exe på Windows Server 2003) til at genstarte og giver en fejlmeddelelse, der indikerer, at genstarten skyldes en mistænkt deadlock-tilstand, bør den stige responseDeadlockInterval-indstilling.
Gem brugernavne og adgangskoder i registreringsbogen
Gem brugernavne og adgangskoder i registreringsbogen
For at kryptere brugernavne og adgangskoder og gemme dem i registret, sæt brugernavn og adgangskode som følger.
userName="registry:HKLM\Software\AspNetProcess,Name"
password="registry:HKLM\Software\AspNetProcess,Pwd"
Den del af strengen, der kommer efter søgeordsregistret og før kommaet, angiver navnet på registreringsnøglen, som ASP.NET åbner. Delen efter kommaet indeholder et streng-værdinavn, hvorfra ASP.NET vil læse legitimationsoplysningerne. Kommaer er påkrævet, og legitimationsoplysninger skal gemmes i HKLM-konfigurationsenheden. Hvis konfigurationen er forkert formateret, vil ASP.NET ikke starte arbejderprocessen og vil efterfølgende dukke op i stien for fejlkoden til den aktuelle kontooprettelse.
Legitimationsoplysningerne skal være i REG_BINARY format og indeholde outputtet af et kald til Windows API-funktionen CryptProtectData. Du kan oprette og gemme krypteringsoplysninger i registreringsdatabasen med ASP.NET Settings Registry Console-applikationen (Aspnet_setreg.exe), som bruger CryptProtectData til at fuldføre krypteringen. For at downloade Aspnet_setreg.exe og Visual C++ kildekode og hjælp, besøg hjemmesidenwww.asp.netog søg efter "aspnet_setreg".
Du bør konfigurere adgang til registreringsnøglerne, der gemmer krypterede legitimationsoplysninger, så adgang kun er tilgængelig for administratorer og SYSTEM. Da registreringsnøglen vil blive læst af den ASP.NET proces, der kører som SYSTEM, bør du sætte følgende tilladelser:
Administrators:F
SYSTEM:F
SKABER-EJER:F
ProcessAccount:R
Dette vil give to forsvarslinjer til beskyttelse af data:
ACL-tilladelser kræver adgang til data med administratorens identitet. Angriberen skal køre kode (CryptUnprotectData) på serveren for at gendanne kontoens legitimationsoplysninger.
eksempel
Følgende eksempel specificerer flere <processModel> konfigurationsindstillinger.
Følgende eksempel angiver, at det krypterede brugernavn og adgangskode gemmes under registreringsdatabasens brugerdefinerede element AspNetProcess.
Krav
- Inkluderet i: <system.web>
- Webplatform: IIS 5.0, IIS 5.1, IIS 6.0
- Konfigurationsfiler: Machine.config, Web.config
- Konfigurationssektionshandler: System.Web.Configuration.ProcessModelConfigurationHandler
http://doc.51windows.net/iismmc/ ... essmodelelement.htm
|
Tidligere:C# afgør, om den uploadede fil er et billede, og forhindrer uploads af trojanske hesteNæste:C-sprog e-bogsamlingsdeling
|