Тази статия е огледална статия за машинен превод, моля, кликнете тук, за да преминете към оригиналната статия.

Изглед: 24448|Отговор: 0

[Източник] . Нетно препълване на паметта (System.OutOfMemoryException).

[Копирай линк]
Публикувано в 14.03.2019 г. 21:47:39 ч. | | | |
Кога се появява изключение от OutOfMemonry? Ако се опитаме да създадем нов обект и събирачът на боклук не може да намери свободна памет, можем да хванем изключението; Друг случай е, че когато CLR се нуждае от памет и системата не може да я предостави, изключението също се хвърля. Но на този етап нашето приложение не може да засече грешката.

Анализ на дебъг на препълване на паметта (OutOfMemoryException).

Адресното пространство на 32-битова операционна система е 4G, от което 2G е заето от операционната система, което означава, че паметта, оставена за потребителския процес, е само 2G (което също отнема част от пространството, заето от изображението при зареждане на програмата, като обикновено може да се използва само около 1.6G~1.8G). Ако даден процес трябва да поиска памет, докато работи, а операционната система не може да му отдели паметно пространство, той ще създаде изключение извън паметта, System.OutOfMemoryException в .net (изключението, което се хвърля, когато няма достатъчно памет за продължаване на изпълнението на програма). Въпреки че крайната проява е OutOfMemoryException, причината може да е различна и преди решаване на този проблем е необходимо да се анализира текущото състояние на използване на паметта на процеса, за да се намери правилната причина, преди да се предпише правилното лекарство. Ето няколко съвета за отстраняване на грешки при такива проблеми.

За повече информация, моля, вижте с:http://blog.csdn.net/lazyleland/article/details/6704661

iis Application Pool Memory Error System.OutOfMemoryException

На ASP.NET уеб сървър количеството памет, което ASP.NET може да използва, обикновено не е равно на цялото количество памет. В конфигурационния файл machine.config <processModel>има свойство "memoryLimit" в секцията за конфигурация, стойността на това свойство е процентна стойност, а по подразбиране е "60", тоест ASP.NET процес (можете да видите ASP.NET процеса в диспечера на задачите, aspnet_wp в IIS5, w3wp в IIS6) може да използва 60% от цялата физическа памет. Когато количеството използвана от ASP.NET памет надвиши този лимит, IIS започва автоматично да рециклира процеса, тоест създава нов процес за обработка на Http заявки и възстановява паметта, заета от стария процес.

Когато имаме сървър с голяма памет, стойността на "memoryLimit" трябва да се коригира съответно. Например, ако подготвим сървър с chemas-microsoft-com ffice marttags" />t="on"> 4G памет, тогава t="on">4G×60%=t="on">2.4G. Въпреки това, за операционните системи Win32 цялото пространство в паметта, което един процес може да заема, е само t="on">2G. Когато паметта, заета от ASP.NET процеса, започне да достига t="on">2G, тъй като не достига "прага за рециклиране" на t="on">2.4G, IIS няма да стартира операцията за рециклиране, но поради ограниченията на Win32 всъщност е невъзможно да се отдели повече памет за този процес, така че OutOfMemoryException вероятно ще бъде изхвърлен. За да избегнем това, трябваше да намалим "лимита на паметта" по подходящ начин, за да може IIS да обработва рециклирането по-рано.

Microsoft препоръчва процесът ASP.NET да заема не повече от 60% от паметта и е най-добре изчислената реална стойност да не надвишава t="on">800M. Въпреки това, за сървър с t="on" > 4G памет, най-добре е да зададете свойството "memoryLimit" на "20". Задаването на подходящ праг за рециклиране на IIS за навременна рециклиране на процеси е много важно, за да се гарантира стабилната работа на целия сървър и да се избегне OutOfMemoryException.

В IIS6 прагът за рециклиране за ASP.NET процеси вече не се определя от свойството "memoryLimit" в секцията за конфигурация, а от настройките в конфигурацията на пула приложения в IIS Manager.

Въпреки това, дори и тези конфигурации да са правилно настроени, няма гаранция, че OutOfMemoryExceptions ще бъдат напълно избегнати, а причините могат да бъдат различни и сложни, като например операциите по възстановяване на паметта да отнемат твърде много време. Разработчиците винаги трябва да имат предвид, че не използват и не губят ненужно памет в кода си. :)

Ако имате сървър с голяма памет и сте разочаровани от ограничението на използването на t="on" >2G памет в операционната система Win32, има две алтернативни решения:

  • Стартирайте компютъра в режим /3GB и следвайте линка след статията за участие в метода
  • Използвайте Windows Server 2003 64-битова версия


Няколко елемента за избягване на препълване на паметта

Ако искате да създадете масив, уверете се, че е с правилния размер.

Уверете се, че имате достатъчно памет за вътрешна употреба и нови хоствани обекти.

Ако програмираш на .NET Compact Framework, публичният езиков runtime изхвърля това изключение, когато няма достатъчно памет за вътрешна употреба или нов управляван обект. За да избегнете това изключение, трябва да избягвате писането на големи методи, които заемат 64KB или повече памет.

Прекомерното използване на управлявана памет често се причинява от:

  • Четете големи набори от данни в паметта.
  • Създаване на твърде много кеширани записи.
  • Качвайте или сваляйте големи файлове.
  • Използвайте твърде много регулярни изрази или низове при анализ на файловете.
  • Статус на прекомерно гледане.
  • Има твърде много данни или твърде много сесии в състояние на сесия.
  • Това изключение може да се появи, когато метод се извика върху COM обект и методът връща потребителски дефиниран тип, който съдържа защитен масив (масив с неограничени размери) с допълнително съобщение "Няма достатъчно място за съхранение за изпълнение на тази операция". Това е така, защото .NET Framework не може да мобилизира структурни полета с сигурни типове масиви.


Пример за препълване на паметта, причинено от неправилна употреба на байтови масиви


Ако изходният файл е особено голям, той може директно да докладва System.OutOfMemoryException. Правилният начин е да се изведе байтовият поток на файла на сегменти, но има asp.net готов метод Response.WriteFile(filePath), който прави точно това.

Следното е правилният начин да се напише:

Когато asp.net изпитва препълване на паметта, лесен начин да се справите с това е веднага да си върнете пула от приложения. Но това не реши напълно проблема.

Препълване на паметта при създаване на тип изображение (System.OutOfMemoryException)

Код на грешка: System.Drawing.Image myimg=System.Drawing.Image.FromFile(file. Пълно име);

Изключения, които се появяват, когато отворен файл не е файл с изображение:



MSDN: Този метод хвърля изключение OutOfMemoryException, ако файлът няма валиден формат на изображението или ако GDI+ не поддържа пикселния формат на файла.

Такава необичайна информация лесно подвежда.

<processModel> елемент

Конфигурирайте настройките на модела на ASP.NET процеси на уеб сървъра на Internet Information Services (IIS). Секцията може да бъде зададена само във файла Machine.config <processModel> и засяга всички ASP.NET приложения, работещи на сървъра.

Предупреждение: За информация относно този елемент, моля, прочетете секцията "Бележки".

Пример за конфигуриране на структурата:

Обяснение

Управляваната система за конфигуриране на код не чете <processModel> настройките на конфигурацията. Вместо това се чете директно от неуправляемия DLL aspnet_isapi.dll. Промените в този раздел влизат в сила след рестартиране на IIS.

Ако инсталирате ASP.NET на домейн контролер, трябва да предприемете специални мерки, иначе инсталацията няма да работи. За повече информация вижте Намиране вhttp://support.microsoft.comСтатията на Microsoft в Knowledge Base CHS315158 "ASP.NET не мога да използвам стандартния ASPNET акаунт на домейн контролери".

Когато ASP.NET работи в нативен режим на IIS версия 6, използва процесния модел IIS 6 и игнорира <processModel> настройките в секцията. За да конфигурирате идентичност на процеса, рециклиране или други стойности на модела на процеси, използвайте потребителския интерфейс на Internet Services Manager, за да конфигурирате IIS worker процесите за вашето приложение.

Времевата стойност е форматирана като "часове:минути:секунди". Ако само едно число е дадено без двоеточие, стойността се приема за минути; Следователно, timeout="4" е еквивалентно на timeout="00:04:00".

Ако ASP.NET приложение предизвика рестартиране на ASP.NET работни процеси (Aspnet_wp.exe на Windows 2000 и Windows XP Professional и W3wp.exe на Windows Server 2003) и даде съобщение за грешка, че рестартът се дължи на подозирано състояние на блокиране, това трябва да се увеличи responseDeadlockНастройка на интервал.

Съхранявайте потребителските имена и пароли в регистъра

Съхранявайте потребителските имена и пароли в регистъра

За да криптирате потребителските имена и паролите и да ги съхранявате в регистъра, задайте потребителското име и паролата по следния начин.

userName="registry:HKLM\Software\AspNetProcess,Name"

password="registry:HKLM\Software\AspNetProcess,Pwd"

Частта от низа, която идва след регистъра на ключовите думи и преди запетая, показва името на ключа за регистъра, който ASP.NET отваря. Частта след запетаята съдържа име на стойност на низа, от което ASP.NET ще прочете идентификационните данни. Необходими са запетаи и идентификационните данни трябва да се съхраняват в конфигурационния модул на HKLM. Ако конфигурацията е неправилно форматирана, ASP.NET няма да стартира worker процеса и впоследствие ще се появи в пътя на кода за неуспех при създаване на текуща сметка.

Идентификационните данни трябва да са в REG_BINARY формат и да съдържат изход от извикване към Windows API функцията CryptProtectData. Можете да създадете и съхранявате криптиращи данни в регистъра с приложението ASP.NET Settings Registry Console (Aspnet_setreg.exe), което използва CryptProtectData за завършване на криптирането. За да изтеглите Aspnet_setreg.exe и Visual C++ изходния код и помощ, посетете уебсайтаwww.asp.netи потърси "aspnet_setreg".

Трябва да конфигурирате достъпа до ключовете на регистъра, които съхраняват криптирани идентификационни данни, така че достъпът да е достъпен само за администраторите и SYSTEM. Тъй като ключът към регистъра ще бъде прочетена от ASP.NET процес, работещ като SYSTEM, трябва да зададете следните права:

Administrators:F

SYSTEM:F

СЪЗДАТЕЛ СОБСТВЕНИК: F

ProcessAccount:R

Това ще осигури две линии на защита на данните:

ACL разрешенията изискват достъп до данни с идентичността на Администратор.
Нападателят трябва да стартира код (CryptUnprotectData) на сървъра, за да възстанови идентификационните данни на акаунта.

пример

Следващият пример определя няколко <processModel> конфигурационни настройки.

Следващият пример уточнява, че криптираното потребителско име и парола се съхраняват под потребителски дефинирания елемент на регистъра AspNetProcess.

Изисквания

  • Включено в: <system.web>
  • Уеб платформа: IIS 5.0, IIS 5.1, IIS 6.0
  • Конфигурационни файлове: Machine.config, Web.config
  • Обработващ секция за конфигурация: System.Web.Configuration.ProcessModelConfigurationHandler


http://doc.51windows.net/iismmc/ ... essmodelelement.htm





Предишен:C# определя дали каченият файл е изображение и предотвратява качването на троянски кон
Следващ:Споделяне на колекция от електронни книги на език C
Отричане:
Целият софтуер, програмни материали или статии, публикувани от Code Farmer Network, са само за учебни и изследователски цели; Горното съдържание не трябва да се използва за търговски или незаконни цели, в противен случай потребителите ще понесат всички последствия. Информацията на този сайт идва от интернет, а споровете за авторски права нямат нищо общо с този сайт. Трябва напълно да изтриете горното съдържание от компютъра си в рамките на 24 часа след изтеглянето. Ако ви харесва програмата, моля, подкрепете оригинален софтуер, купете регистрация и получете по-добри услуги. Ако има нарушение, моля, свържете се с нас по имейл.

Mail To:help@itsvse.com