Kedy sa vyskytuje OutOfMemonryException? Ak sa pokúsime vytvoriť nový objekt a garbage collector nenájde žiadnu voľnú pamäť, môžeme zachytiť výnimku; Ďalším prípadom je, že keď CLR potrebuje pamäť a systém ju nemôže poskytnúť, výnimka sa tiež vyhodí. Ale v tomto bode naša aplikácia chybu nedokáže zachytiť.
Debug analýza pretečenia pamäte (OutOfMemoryException).
Adresný priestor 32-bitového operačného systému je 4G, z čoho 2G je obsadené operačným systémom, čo znamená, že pamäť zostávajúca pre používateľský proces je len 2G (čo tiež odpočítava časť priestoru zaberaného obrazom pri načítaní programu, všeobecne sa dá použiť len asi 1,6G~1,8G). Ak proces potrebuje žiadať pamäť počas svojho behu a operačný systém mu nemôže priradiť pamäťový priestor, vytvorí výnimku mimo pamäte, System.OutOfMemoryException v .net (Výnimka, ktorá sa vyhodí, keď nie je dostatok pamäte na pokračovanie v vykonávaní programu). Hoci poslednou manifestáciou je OutOfMemoryException, príčina môže byť iná, a pred vyriešením tohto problému je potrebné analyzovať aktuálny stav využitia pamäte procesu, aby sa našla správna príčina pred predpísaním správneho lieku. Tu je niekoľko tipov na ladenie takýchto problémov.
Pre viac informácií navštívte:http://blog.csdn.net/lazyleland/article/details/6704661
iis Application Pool Memory Overflow Error System.OutOfMemoryException
Na ASP.NET webovom serveri množstvo pamäte, ktoré ASP.NET môže použiť, zvyčajne nie je rovné celému množstvu pamäte. V konfiguračnom súbore machine.config <processModel>je vlastnosť "memoryLimit" v sekcii konfigurácie, hodnota tejto vlastnosti je percentuálna hodnota, predvolená je "60", teda ASP.NET proces (ASP.NET proces môžete vidieť v správcovi úloh, aspnet_wp v IIS5, w3wp v IIS6) môže využiť 60 % všetkej fyzickej pamäte. Keď množstvo pamäte použitej ASP.NET tento limit prekročí, IIS začne proces automaticky recyklovať, teda vytvorí nový proces na spracovanie HTTP požiadaviek a získa späť pamäť obsadenú starým procesom.
Keď máme server s veľkou pamäťou, hodnota "memoryLimit" sa musí primerane upraviť. Napríklad, ak pripravíme server s chemas-microsoft-com ffice marttags" />t="on"> 4G pamäťou, potom t="on">4G×60%=t="on">2.4G. Avšak pre operačné systémy Win32 je všetok pamäťový priestor, ktorý môže proces zaberať, len t="zapnuté">2G. Keď pamäť obsadená procesom ASP.NET začne dosahovať t="on">2G, pretože nedosiahne "recyklačný prah" t="on">2.4G, IIS nespustí cyklus recyklácie, ale kvôli obmedzeniam Win32 je v skutočnosti nemožné prideliť viac pamäte tomuto procesu, takže je pravdepodobné, že bude hodená OutOfMemoryException. Aby sme tomu predišli, museli sme správne znížiť "memoryLimit", aby IIS mohol spracovať recykláciu skôr.
Microsoft odporúča, aby ASP.NET proces nezaberal viac ako 60 % pamäte a najlepšie je, aby vypočítaná skutočná hodnota nebola vyššia ako t="zapnuto">800M. Napriek tomu, pre server s t="zapnutou" > 4G pamäťou je najlepšie nastaviť vlastnosť "memoryLimit" na "20". Nastavenie vhodného prahu recyklácie pre IIS, aby mohol procesy recyklovať včas, je veľmi dôležité na zabezpečenie stabilnej prevádzky celého servera a vyhnutie sa OutOfMemoryException.
V IIS6 už prah recyklácie pre ASP.NET procesy nie je určený vlastnosťou "memoryLimit" v sekcii konfigurácie, ale nastaveniami v konfigurácii aplikačného poolu v IIS Manageri.
Avšak aj keď sú tieto konfigurácie nastavené správne, nie je zaručené, že sa OutOfMemoryExceptions úplne obídu, a dôvody môžu byť rôznorodé a zložité, napríklad operácie obnovy pamäte môžu byť príliš časovo náročné. Vývojári by mali vždy pamätať na to, aby nepoužívali a zbytočne neplytvali pamäťou vo svojom kóde. :)
Ak máte server s veľkou pamäťou a frustruje vás obmedzenie používania t="zapnuté" >2G pamäte v operačnom systéme Win32, existujú dve alternatívne riešenia:
- Spustite počítač v /3GB režime a nasledujte odkaz za článkom o metóde účasti
- Použite Windows Server 2003 64bits Edition
Niekoľko prvkov na zabránenie pretečeniu pamäte
Ak chcete vytvoriť pole, uistite sa, že má správnu veľkosť.
Uistite sa, že máte dostatok pamäte na interné použitie a nové hostované objekty.
Ak programujete v .NET Compact Framework, verejný jazyk za behu túto výnimku vyhodí, keď nie je dostatok pamäte na interné použitie alebo nový spravovaný objekt. Aby ste sa tejto výnimke vyhli, mali by ste sa vyhnúť písaniu veľkých metód, ktoré zaberajú 64KB alebo viac pamäte.
Nadmerné využívanie spravovanej pamäte je často spôsobené:
- Čítajte veľké dátové súbory do pamäte.
- Vytvára príliš veľa uložených záznamov.
- Nahrávajte alebo sťahujte veľké súbory.
- Pri analýze súborov používajte príliš veľa regulárnych výrazov alebo reťazcov.
- Nadmerný stav zobrazenia.
- V stave relácie je príliš veľa dát alebo príliš veľa relácií.
- Táto výnimka môže byť vyvolaná, keď je na COM objekte zavolaná metóda a metóda vráti používateľom definovaný typ, ktorý obsahuje bezpečné pole (pole neurčitých veľkostí) s ďalšou správou "Nedostatok úložného priestoru na dokončenie tejto operácie". Je to preto, že .NET Framework nedokáže mapovať štrukturálne polia s bezpečnými typmi polí.
Príklad prekročenia pamäte spôsobeného nesprávnym použitím bajtových polí
Ak je výstupný súbor obzvlášť veľký, môže priamo hlásiť System.OutOfMemoryException. Správny spôsob je výstupom bajtového prúdu súboru v segmentoch, ale existuje už asp.net pripravená metóda Response.WriteFile(filePath), ktorá to robí.
Nasleduje správny spôsob písania:
Keď asp.net zažije pretečenie pamäte, jednoduchý spôsob, ako to riešiť, je okamžite získať aplikačný pool. To však problém úplne nevyriešilo.
Pretečenie pamäte pri vytváraní typu obrazu (System.OutOfMemoryException)
Kód chyby: System.Drawing.Image myimg=System.Drawing.Image.FromFile(file. FullName);
Výnimky, ktoré sa vyhodia, keď otvorený súbor nie je obrazovým súborom:
MSDN: Táto metóda vyhodí výnimku OutOfMemoryException, ak súbor nemá platný formát obrázka alebo ak GDI+ nepodporuje pixelový formát súboru.
Takéto abnormálne informácie sú ľahko zavádzajúce.
<processModel> Prvok
Nakonfigurujte nastavenia modelu procesu ASP.NET na webovom serveri Internet Information Services (IIS). Sekciu je možné nastaviť iba v súbore Machine.config <processModel> a ovplyvňuje všetky ASP.NET aplikácie bežiace na serveri.
Upozornenie: Pre informácie o tomto prvku, prosím, prečítajte si sekciu "Poznámky".
Príklad konfigurácie štruktúry:
Exegéza
Spravovaný konfiguračný systém kódu nečíta <processModel> nastavenia konfigurácie. Namiesto toho ho číta priamo nespravovaný DLL aspnet_isapi.dll. Zmeny v tejto časti nadobudnú účinnosť po reštarte IIS.
Ak ASP.NET nainštalujete na doménový kontrolér, musíte podniknúť špeciálne kroky, inak inštalácia nebude fungovať. Pre viac informácií pozri Umiestnené vhttp://support.microsoft.comČlánok Microsoftu v Knowledge Base CHS315158 "ASP.NET nemôžu používať predvolený účet ASPNET na doménových kontroléroch".
Keď ASP.NET beží v natáčnom režime IIS verzie 6, používa model procesu IIS 6 a <processModel> ignoruje nastavenia v sekcii. Na konfiguráciu identity procesu, recyklácie alebo iných hodnôt modelu procesu použite používateľské rozhranie Internet Services Manager na konfiguráciu pracovných procesov IIS pre vašu aplikáciu.
Hodnota času je formátovaná ako "hours:minutes:seconds". Ak je uvedené len jedno číslo bez dvojbodky, predpokladá sa, že hodnota sú minúty; Preto časový limit="4" je ekvivalentný časovému limitu="00:04:00".
Ak ASP.NET aplikácia spôsobí, že ASP.NET pracovné procesy (Aspnet_wp.exe na Windows 2000 a Windows XP Professional a W3wp.exe na Windows Server 2003) reštartujú a zobrazí chybové hlásenie, že reštart je spôsobený podozrením na zablokovanie, malo by sa to zvýšiť nastavenie responseDeadlockInterval.
Ukladajte používateľské mená a heslá do registra
Ukladajte používateľské mená a heslá do registra
Na šifrovanie používateľských mien a hesiel a ich uloženie v registri nastavte používateľské meno a heslo nasledovne.
userName="registry:HKLM\Software\AspNetProcess,Name"
password="registry:HKLM\Software\AspNetProcess,Pwd"
Časť reťazca, ktorá nasleduje za registrom kľúčových slov a pred čiarkou, označuje názov registrového kľúča, ktorý ASP.NET otvorí. Časť za čiarkou obsahuje meno hodnoty reťazca, z ktorého ASP.NET číta prihlasovacie údaje. Sú potrebné čiarky a prihlasovacie údaje musia byť uložené v konfiguračnej jednotke HKLM. Ak je konfigurácia nesprávne naformátovaná, ASP.NET nespustí pracovný proces a následne sa objaví v ceste kódu zlyhania pri vytváraní aktuálneho účtu.
Prihlasovacie údaje musia byť v REG_BINARY formáte a obsahovať výstup volania funkcie Windows API CryptProtectData. Šifrovacie prihlasovacie údaje môžete vytvárať a ukladať v registri pomocou aplikácie ASP.NET Settings Registry Console (Aspnet_setreg.exe), ktorá používa CryptProtectData na dokončenie šifrovania. Ak si chcete stiahnuť zdrojový kód Aspnet_setreg.exe a Visual C++ a pomoc, navštívte webovú stránkuwww.asp.neta vyhľadajte "aspnet_setreg".
Mali by ste nastaviť prístup k registrovým kľúčom, ktoré ukladajú šifrované prihlasovacie údaje, tak, aby prístup mali len administrátori a SYSTEM. Keďže kľúč v registri bude prečítaný procesom ASP.NET bežiacim ako SYSTEM, mali by ste nastaviť nasledujúce povolenia:
Administrators:F
SYSTEM:F
VLASTNÍK TVORCU:F
ProcessAccount:R
To poskytne dve línie obrany na ochranu dát:
Oprávnenia ACL vyžadujú prístup k dátam s identitou Administrátora. Útočník by musel spustiť kód (CryptUnprotectData) na serveri, aby obnovil prihlasovacie údaje účtu.
príklad
Nasledujúci príklad špecifikuje niekoľko <processModel> konfiguračných nastavení.
Nasledujúci príklad špecifikuje, že zašifrované používateľské meno a heslo sú uložené pod používateľom definovanou položkou registra AspNetProcess.
Požiadavky
- Zahrnuté v: <system.web>
- Webová platforma: IIS 5.0, IIS 5.1, IIS 6.0
- Konfiguračné súbory: Machine.config, Web.config
- Handler sekcie konfigurácie: System.Web.Configuration.ProcessModelConfigurationHandler
http://doc.51windows.net/iismmc/ ... essmodelelement.htm
|