|
|
Zveřejněno 14.03.2019 21:47:39
|
|
|
|

Kdy se objeví výjimka OutOfMemonry? Pokud se pokusíme vytvořit nový objekt a garbage collector nenajde žádnou volnou paměť, můžeme zachytit výjimku; Další případ je, že když CLR potřebuje paměť a systém ji nemůže poskytnout, výjimka se také vyhodí. Ale v tuto chvíli naše aplikace chybu nedokáže zachytit.
Debug analýza přetečení v paměti (OutOfMemoryException).
Adresní prostor 32bitového operačního systému je 4G, z čehož 2G je obsazeno operačním systémem, což znamená, že paměť pro uživatelský proces je pouze 2G (což také odečítá část místa zabíraného obrazem při načítání programu, obecně lze použít pouze asi 1,6G~1,8G). Pokud proces potřebuje požádat o paměť během běhu a operační systém mu nemůže přidělit paměťový prostor, vytvoří výjimku mimo paměť, System.OutOfMemoryException v .net (výjimka, která se vyhodí, když není dostatek paměti pro pokračování v provádění programu). Ačkoliv je konečnou manifestací OutOfMemoryException, příčina může být jiná, a před vyřešením tohoto problému je nutné analyzovat aktuální stav využití paměti procesu, abychom našli správnou příčinu před předepsáním správného léku. Zde je několik tipů, jak takové problémy ladit.
Pro více informací se podívejte na:http://blog.csdn.net/lazyleland/article/details/6704661
iis Application Pool Memory Overflow Error System.OutOfMemoryException
Na ASP.NET webovém serveru není množství paměti, které ASP.NET může využít, obvykle neodpovídá celému množství paměti. V konfiguračním souboru machine.config <processModel>je vlastnost "memoryLimit" v sekci konfigurace, hodnota této vlastnosti je procentuální hodnota, výchozí je "60", tedy proces ASP.NET (ASP.NET proces můžete vidět ve správci úloh, aspnet_wp v IIS5, w3wp v IIS6) může využít 60 % veškeré fyzické paměti. Když množství využité paměti ASP.NET tento limit překročí, IIS začne proces automaticky recyklovat, tedy vytvořit nový proces pro zpracování HTTP požadavků a získat zpět paměť obsazenou starým procesem.
Když máme server s velkou pamětí, je třeba hodnotu "memoryLimit" správně upravit. Například pokud připravíme server s chemas-microsoft-com ffice marttags" />t="on"> 4G paměti, pak t="on">4G×60%=t="on">2.4G. Nicméně u operačních systémů s Win32 je veškerý paměťový prostor, který může proces zabírat, pouze t="zapnuto">2G. Když paměť obsazená procesem ASP.NET začne dosahovat t="zapnuto">2G, protože nedosáhne "recyklačního prahu" t="zapnuto">2,4G, IIS nespustí operaci recyklačního procesu, ale kvůli omezením Win32 je ve skutečnosti nemožné tomuto procesu přidělit více paměti, takže je pravděpodobné, že bude vyhozena výjimka OutOfMemory. Abychom tomu předešli, museli jsme "memoryLimit" správně omezit, aby IIS mohl zpracovávat recyklaci dříve.
Microsoft doporučuje, aby ASP.NET proces zabíral maximálně 60 % paměti a bylo nejlepší nastavit vypočítanou skutečnou hodnotu maximálně t="zapnuto">800M. Nicméně pro server s t="zapnutou" > 4G pamětí je nejlepší nastavit vlastnost "memoryLimit" na "20". Stanovení vhodného prahu recyklace, aby IIS mohl procesy recyklovat včas, je velmi důležité pro zajištění stabilního provozu celého serveru a předejít se OutOfMemoryException.
V IIS6 už není práh recyklace pro ASP.NET procesy určen vlastností "memoryLimit" v sekci konfigurace, ale nastavením v konfiguraci aplikačního poolu v IIS Manageru.
Nicméně i když jsou tyto konfigurace nastaveny správně, není zaručeno, že se OutOfMemoryExceptions zcela vyhnou, a důvody mohou být různorodé a složité, například operace obnovy paměti mohou být příliš časově náročné. Vývojáři by měli vždy pamatovat, že nevyužívají a neplýtvají pamětí zbytečně ve svém kódu. :)
Pokud máte server s velkou pamětí a frustruje vás omezení používání t="zapnuté" >2G paměti v operačním systému Win32, existují dvě alternativní řešení:
- Spusť počítač v režimu /3GB a následuj odkaz za článkem o metodě účasti
- Použijte Windows Server 2003 64bits Edition
Několik prvků, které se vyhýbají přetečení paměti
Pokud chcete vytvořit pole, ujistěte se, že má správnou velikost.
Ujistěte se, že máte dostatek paměti pro interní použití a nové hostované objekty.
Pokud programujete v .NET Compact Frameworku, běžný jazyk pro veřejný jazyk tuto výjimku vyhodí, když není dostatek paměti pro interní použití nebo nový spravovaný objekt. Aby se této výjimky vyhnuli, měli byste se vyhnout psaní velkých metod, které zabírají 64KB nebo více paměti.
Nadměrné využití spravované paměti je často způsobeno:
- Čtěte velké datové sady do paměti.
- Vytváření příliš mnoha uložených záznamů.
- Nahrávejte nebo stahujte velké soubory.
- Při analýze souborů používejte příliš mnoho regulárních výrazů nebo řetězců.
- Nadměrný stav zobrazení.
- Ve stavu relace je příliš mnoho dat nebo příliš mnoho relací.
- Tato výjimka může být vyvolána, když je metoda vyvolána na objektu COM a metoda vrátí uživatelem definovaný typ obsahující bezpečné pole (pole neurčitých velikostí) s další zprávou "Není dostatek úložného místa k dokončení této operace". Je to proto, že .NET Framework nemůže spravovat strukturální pole pomocí bezpečných typů polí.
Příklad překročení paměti způsobeného nesprávným použitím bajtových polí
Pokud je výstupní soubor obzvlášť velký, může přímo hlásit System.OutOfMemoryException. Správný způsob je výstup bajtového proudu souboru v segmentech, ale existuje už asp.net hotová metoda Response.WriteFile(filePath), která to přesně umožňuje.
Následující je správný způsob psaní:
Když asp.net zažije přetečení paměti, jednoduchý způsob, jak se s tím vypořádat, je ihned získat zpět aplikační pool. To však problém zcela nevyřešilo.
Přetečení paměti při vytváření typu obrazu (System.OutOfMemoryException)
Chybový kód: System.Drawing.Image myimg=System.Drawing.Image.FromFile(file. FullName);
Výjimky, které se vyhodí, když otevřený soubor není obrazovým souborem:
MSDN: Tato metoda vyhodí výjimku OutOfMemoryException, pokud soubor nemá platný formát obrázku, nebo pokud GDI+ nepodporuje pixelový formát souboru.
Takové neobvyklé informace jsou snadno zavádějící.
<processModel> prvek
Nastavte ASP.NET nastavení modelu procesu na webovém serveru Internet Information Services (IIS). Sekce může být nastavena pouze v souboru Machine.config <processModel> a ovlivňuje všechny ASP.NET aplikace běžící na serveru.
Varování: Pro informace o tomto prvku si prosím přečtěte sekci "Poznámky".
Příklad konfigurace konstrukce:
exegeze
Systém pro konfiguraci spravovaného kódu nečte <processModel> nastavení konfigurace. Místo toho je čten přímo nespravovaným DLL aspnet_isapi.dll. Změny v této části nastávají účinnosti po restartu IIS.
Pokud ASP.NET nainstalujete na doménový řadič, musíte podniknout speciální kroky, jinak instalace nebude fungovat. Pro více informací viz Umístěno vhttp://support.microsoft.comČlánek Microsoftu v Knowledge Base CHS315158 "ASP.NET nelze používat výchozí účet ASPNET na řadičích domény".
Když ASP.NET běží v nativním režimu IIS verze 6, používá model procesu IIS 6 a <processModel> ignoruje nastavení v sekci. Pro konfiguraci identity procesu, recyklace nebo jiných hodnot modelu procesu použijte uživatelské rozhraní Internet Services Manager k nakonfigurování pracovních procesů IIS pro vaši aplikaci.
Hodnota času je naformátována jako "hours:minutes:seconds". Pokud je uvedeno pouze jedno číslo bez dvojtečky, předpokládá se, že hodnota jsou minuty; Proto je timeout="4" ekvivalentní timeoutu="00:04:00".
Pokud ASP.NET aplikace způsob ASP.NET í restart pracovních procesů (Aspnet_wp.exe na Windows 2000 a Windows XP Professional a W3wp.exe na Windows Server 2003) a zobrazí chybovou zprávu, že restart je způsoben podezřením na zablokování, mělo by se to zvýšit nastavení responseDeadlockInterval.
Ukládejte uživatelská jména a hesla do registru
Ukládejte uživatelská jména a hesla do registru
Pro šifrování uživatelských jmen a hesel a jejich uložení v registru nastavte uživatelské jméno a heslo následovně.
userName="registry:HKLM\Software\AspNetProcess,Name"
password="registry:HKLM\Software\AspNetProcess,Pwd"
Část řetězce, která přichází za klíčovým slovem registry a před čárkou, označuje název registry klíče, který ASP.NET otevře. Část za čárkou obsahuje název řetězce hodnoty, ze kterého ASP.NET přečte přihlašovací údaje. Jsou vyžadovány čárky a přihlašovací údaje musí být uloženy v konfigurační jednotce HKLM. Pokud je konfigurace špatně naformátovaná, ASP.NET nespustí pracovní proces a následně se objeví v cestě kódu selhání pro vytvoření aktuálního účtu.
Přihlašovací údaje musí být ve REG_BINARY formátu a obsahovat výstup volání k Windows API funkci CryptProtectData. Šifrovací přihlašovací údaje můžete vytvářet a ukládat v registru pomocí aplikace ASP.NET Settings Registry Console (Aspnet_setreg.exe), která používá CryptProtectData k dokončení šifrování. Pro stažení zdrojového kódu Aspnet_setreg.exe a Visual C++ a pomoc navštivte webové stránkywww.asp.neta vyhledávat "aspnet_setreg".
Měli byste nastavit přístup k registrovým klíčům, které uchovávají šifrované přihlašovací údaje, tak, aby přístup byl dostupný pouze administrátorům a SYSTEMu. Protože klíč registru bude přečten procesem ASP.NET běžícím jako SYSTEM, měli byste nastavit následující oprávnění:
Administrators:F
SYSTEM:F
VLASTNÍK TVŮRCE:F
ProcessAccount:R
To poskytne dvě obranné linie pro ochranu dat:
Oprávnění ACL vyžadují přístup k datům s identitou administrátora. Útočník by musel spustit kód (CryptUnprotectData) na serveru, aby obnovil přihlašovací údaje účtu.
příklad
Následující příklad specifikuje několik <processModel> konfiguračních nastavení.
Následující příklad specifikuje, že zašifrované uživatelské jméno a heslo jsou uloženy pod uživatelsky definovanou položkou registru AspNetProcess.
Požadavky
- Zahrnuto v: <system.web>
- Webová platforma: IIS 5.0, IIS 5.1, IIS 6.0
- Konfigurační soubory: Machine.config, Web.config
- Handler sekce Configuration: System.Web.Configuration.ProcessModelConfigurationHandler
http://doc.51windows.net/iismmc/ ... essmodelelement.htm
|
Předchozí:C# určuje, zda je nahraný soubor obrazem, a zabraňuje nahrávání trojského koněDalší:Sdílení kolekcí e-knih v jazyce C
|