Kdaj pride do izjeme OutOfMemonry? Če poskušamo ustvariti nov objekt in zbiralnik smeti ne najde prostega pomnilnika, lahko ujamemo izjemo; Drug primer je, da ko CLR potrebuje pomnilnik in ga sistem ne more zagotoviti, se izjema prav tako zavrže. A trenutno naša aplikacija napake ne more zaznati.
Analiza razhroščevanja presežka pomnilnika (OutOfMemoryException).
Naslavljalni prostor 32-bitnega operacijskega sistema je 4G, od tega 2G zaseda operacijski sistem, kar pomeni, da je pomnilnik za uporabniški proces le 2G (kar prav tako odvzame del prostora, ki ga zaseda slika ob nalaganju programa, običajno je mogoče uporabiti le okoli 1,6G~1,8G). Če mora proces med izvajanjem zahtevati pomnilnik in operacijski sistem mu ne more dodeliti pomnilniškega prostora, bo v .net ustvaril izjemo zaradi izpusta pomnilnika, System.OutOfMemoryException (izjema, ki se sproži, kadar ni dovolj pomnilnika za nadaljevanje izvajanja programa). Čeprav je končna manifestacija OutOfMemoryException, je vzrok lahko drugačen, zato je pred reševanjem tega problema potrebno analizirati trenutno stanje uporabe pomnilnika v procesu, da najdemo pravi vzrok, preden predpišemo pravo zdravilo. Tukaj je nekaj nasvetov za odpravljanje napak pri takšnih težavah.
Za več informacij si oglejte:http://blog.csdn.net/lazyleland/article/details/6704661
iis Application Pool Memory Overflow Error System.OutOfMemoryException
Na ASP.NET spletnem strežniku količina pomnilnika, ki ga ASP.NET lahko uporabi, običajno ni enaka celotni količini pomnilnika. V konfiguracijski datoteki machine.config <processModel>je v konfiguracijskem razdelku lastnost "memoryLimit", vrednost te lastnosti je odstotek, privzeta pa je "60", kar pomeni, da ASP.NET proces (ASP.NET proces lahko vidite v upravitelju opravil, aspnet_wp v IIS5, w3wp v IIS6) lahko uporabi 60 % vsega fizičnega pomnilnika. Ko količina pomnilnika, ki ga ASP.NET porabi, preseže to omejitev, IIS začne samodejno reciklirati proces, torej ustvariti nov proces za obravnavo HTTP zahtevkov in ponovno pridobiti pomnilnik, ki ga je zasedel stari proces.
Ko imamo strežnik z velikim pomnilnikom, je treba vrednost "memoryLimit" ustrezno prilagoditi. Na primer, če pripravimo strežnik s chemas-microsoft-com ffice marttags" />t="on"> 4G pomnilnik, potem t="on">4G×60%=t="on">2.4G. Vendar pa je za operacijske sisteme Win32 ves pomnilniški prostor, ki ga lahko proces zasede, le t="vklopljen">2G. Ko pomnilnik, ki ga zaseda ASP.NET proces, začne dosegati t="vklopljeno">2G, ker ne doseže "praga recikliranja" t="vklopljeno">2,4G, IIS ne bo začel postopka recikliranja, vendar zaradi omejitev Win32 dejansko ni mogoče dodeliti več pomnilnika temu procesu, zato bo verjetno zavržen OutOfMemoryException. Da bi se temu izognili, smo morali ustrezno zmanjšati "memoryLimit", da je IIS lahko prej procesiral recikliranje.
Microsoft priporoča, da ASP.NET proces zavzame največ 60 % pomnilnika, in najbolje je, da izračunana dejanska vrednost ne presega t="v«>800M. Kljub temu je za strežnik s t="on" > 4G pomnilniku najbolje nastaviti lastnost "memoryLimit" na "20". Nastavitev ustreznega praga recikliranja, da IIS lahko reciklira procese pravočasno, je zelo pomembna za zagotavljanje stabilnega delovanja celotnega strežnika in preprečevanje OutOfMemoryException.
V IIS6 prag recikliranja za ASP.NET procese ni več določen z lastnostjo "memoryLimit" v konfiguracijskem razdelku, temveč z nastavitvami v konfiguraciji aplikacijskega bazena v IIS Managerju.
Vendar pa tudi če so te konfiguracije pravilno nastavljene, ni zagotovila, da se bodo izjeme OutOfMemoryException popolnoma izognile, razlogi pa so lahko različni in zapleteni, na primer operacije obnove pomnilnika so lahko preveč zamudne. Razvijalci naj vedno upoštevajo, da ne uporabljajo in nepotrebno zapravljajo pomnilnika v svoji kodi. :)
Če imate strežnik z velikim pomnilnikom in vas frustrira omejitev uporabe t="vklopljenega" >2G pomnilnika v operacijskem sistemu Win32, obstajata dve alternativni rešitvi:
- Zaženi računalnik v načinu /3GB in sledi povezavi za člankom o sodelovanju v metodi
- Uporabite Windows Server 2003 64bits Edition
Več elementov za preprečevanje presežka pomnilnika
Če želite ustvariti polje, poskrbite, da je pravilne velikosti.
Poskrbi, da imaš dovolj pomnilnika za interno uporabo in nove gostovane objekte.
Če programirate v .NET Compact Framework, javni jezik za izvajanje sproži to izjemo, kadar ni dovolj pomnilnika za notranjo uporabo ali nov upravljani objekt. Da bi se izognili tej izjemi, se izogibajte pisanju velikih metod, ki zavzamejo 64KB ali več pomnilnika.
Prekomerna uporaba upravljanega pomnilnika je pogosto posledica:
- Preberi velike podatkovne zbirke v pomnilnik.
- Ustvarjanje preveč predpomnjenih vnosov.
- Naložite ali prenesite velike datoteke.
- Pri analizi datotek uporabite preveč regularnih izrazov ali nizov.
- Status preveč ogledov.
- V stanju seje je preveč podatkov ali preveč sej.
- To izjemo lahko sprožimo, ko je metoda poklicana na COM objektu in metoda vrne uporabniško definiran tip, ki vsebuje varno polje (polje nedoločenih velikosti) z dodatnim sporočilom "Ni dovolj prostora za shranjevanje za dokončanje te operacije". To je zato, ker .NET Framework ne more združevati strukturnih polj z varnimi tipi polj.
Primer presežka pomnilnika zaradi nepravilne uporabe bajtnih polj
Če je izhodna datoteka posebej velika, lahko neposredno poroča o System.OutOfMemoryException. Pravilen način za to je, da se bajtni tok datoteke izpiše v segmentih, vendar obstaja že asp.net pripravljena metoda Response.WriteFile(filePath), ki to omogoča.
Naslednje je pravilen način pisanja:
Ko asp.net doživi presežek pomnilnika, je enostaven način, da se s tem spopadete, takoj, da povrnete aplikacijski bazen. A to ni povsem rešilo problema.
Prelivanje pomnilnika pri ustvarjanju vrste slike (System.OutOfMemoryException)
Koda napake: System.Drawing.Image myimg=System.Drawing.Image.FromFile(file. FullName);
Izjeme, ki se pojavijo, kadar odprta datoteka ni slikovna datoteka:
MSDN: Ta metoda sproži izjemo OutOfMemoryException, če datoteka nima veljavnega formata slike ali če GDI+ ne podpira formata pikslov datoteke.
Takšne nenavadne informacije so zlahka zavajajoče.
<processModel> element
Nastavite nastavitve modela procesa ASP.NET na spletnem strežniku Internet Information Services (IIS). Razdelek je mogoče nastaviti le v datoteki Machine.config <processModel> in vpliva na vse ASP.NET aplikacije, ki tečejo na strežniku.
Opozorilo: Za informacije o tem elementu preberite razdelek "Opombe".
Primer konfiguracije strukture:
Exegesis
Sistem za konfiguracijo upravljane kode ne bere <processModel> nastavitev konfiguracije. Namesto tega ga neposredno bere neupravljani DLL aspnet_isapi.dll. Spremembe v tem razdelku začnejo veljati po ponovnem zagonu IIS.
Če ASP.NET namestite na domenski krmilnik, morate sprejeti posebne ukrepe, sicer namestitev ne bo delovala. Za več informacij glejte Located inhttp://support.microsoft.comMicrosoftov članek v Knowledge Base CHS315158 "ASP.NET ne more uporabljati privzetega računa ASPNET na domenskih krmilnikih".
Ko ASP.NET teče v izvornem načinu IIS različice 6, uporablja model procesa IIS 6 in ignorira <processModel> nastavitve v razdelku. Za konfiguracijo identitete procesa, recikliranja ali drugih vrednosti modela procesa uporabite uporabniški vmesnik Internet Services Manager za konfiguracijo IIS delovnih procesov za vašo aplikacijo.
Vrednost časa je oblikovana kot "ure:minute:sekunde". Če je podana le ena številka brez dvopičarja, se vrednost predpostavi kot minute; Zato je časovna omejitev="4" enakovredna časovni kazni="00:04:00".
Če ASP.NET aplikacija povzroči ASP.NET, da se delovni procesi (Aspnet_wp.exe na Windows 2000 in Windows XP Professional ter W3wp.exe na Windows Server 2003) ponovno zaženejo in prikaže sporočilo o napaki, da je ponovni zagon posledica suma zastoja, bi se moral ta zagon povečati odzivDeadlockInterval nastavitev.
Shranjujte uporabniška imena in gesla v registru
Shranjujte uporabniška imena in gesla v registru
Za šifriranje uporabniških imen in gesel ter njihovo shranjevanje v registru nastavite uporabniško ime in geslo na naslednji način.
userName="registry:HKLM\Software\AspNetProcess,Name"
password="registry:HKLM\Software\AspNetProcess,Pwd"
Del niza, ki sledi registru ključnih besed in pred vejico, označuje ime registrskega ključa, ki ga ASP.NET odpre. Del za vejico vsebuje ime vrednosti niza, iz katerega ASP.NET prebere poverilnice. Vejice so potrebne in poverilnice morajo biti shranjene v konfiguracijski enoti HKLM. Če je konfiguracija napačno formatirana, ASP.NET ne bo zagnala delovnega procesa in se bo nato pojavila na poti kode napake pri ustvarjanju tekočega računa.
Poverilnice morajo biti v REG_BINARY formatu in vsebovati izhod klica funkcije Windows API CryptProtectData. Šifrirne poverilnice lahko ustvarite in shranite v registru z aplikacijo ASP.NET Settings Registry Console (Aspnet_setreg.exe), ki za dokončanje šifriranja uporablja CryptProtectData. Za prenos izvorne kode Aspnet_setreg.exe in Visual C++ ter pomoč obiščite spletno stranwww.asp.netin poiščite "aspnet_setreg".
Dostop do registrskih ključev, ki shranjujejo šifrirane poverilnice, bi morali nastaviti tako, da je dostop na voljo le administratorjem in SYSTEM-u. Ker bo register ključ prebral ASP.NET proces, ki teče kot SYSTEM, morate nastaviti naslednja dovoljenja:
Administrators:F
SYSTEM:F
LASTNIK USTVARJALCA:F
ProcessAccount:R
To bo zagotovilo dve obrambni liniji za zaščito podatkov:
Dovoljenja ACL zahtevajo dostop do podatkov z identiteto administratorja. Napadalec bi moral na strežniku zagnati kodo (CryptUnprotectData), da bi obnovil poverilnice računa.
primer
Naslednji primer določa več <processModel> nastavitev konfiguracije.
Naslednji primer določa, da sta šifrirano uporabniško ime in geslo shranjena pod uporabniško definiranim elementom registra AspNetProcess.
Zahteve
- Vključeno v: <system.web>
- Spletna platforma: IIS 5.0, IIS 5.1, IIS 6.0
- Konfiguracijske datoteke: Machine.config, Web.config
- Handler konfiguracijskega odseka: System.Web.Configuration.ProcessModelConfigurationHandler
http://doc.51windows.net/iismmc/ ... essmodelelement.htm
|