Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 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 Overflow 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, скорее всего, будет сброшен. Чтобы этого избежать, нам пришлось сократить «memoryLimit» соответствующим образом, чтобы 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, публичная среда выполнения выдает это исключение, когда недостаточно памяти для внутреннего использования или нового управляемого объекта. Чтобы избежать этого исключения, следует избегать написания больших методов, занимающих 64 КБ и более памяти.

Чрезмерное использование управляемой памяти часто вызвано:

  • Читайте большие наборы данных в память.
  • Создание слишком большого количества кэшированных записей.
  • Загружайте или скачивайте большие файлы.
  • Используйте слишком много регулярных выражений или строк при анализе файлов.
  • Статус чрезмерных просмотров.
  • В состоянии сессии слишком много данных или слишком много сессий.
  • Это исключение может возникнуть, когда метод вызывается на объекте COM, и метод возвращает пользовательский тип, содержащий защищённый массив (массив неопределённых размеров) с дополнительным сообщением «Недостаточно места для хранения для выполнения этой операции». Это связано с тем, что .NET-фреймворк не может объединять структурные поля с безопасными типами массивов.


Пример перегрузки памяти, вызванной неправильным использованием байтовых массивов


Если выходной файл особенно большой, он может напрямую сообщать о 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 в базе знаний CHS315158 «ASP.NET не могу использовать стандартную учетную запись ASPNET на контроллерах домена».

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

Значение времени отформатировано как «часы:минуты:секунды». Если дано только одно число без двоеточия, считается значением минут; Таким образом, timeout="4" эквивалентен timeout="00:04:00".

Если ASP.NET приложение вызывает перезагрузку рабочих процессов ASP.NET (Aspnet_wp.exe в Windows 2000 и Windows XP Professional и W3wp.exe на Windows Server 2003) и появляется сообщение об ошибке, указывающее, что перезагрузка связана с подозрением в состоянии зависимости, это число должно увеличиться responseDeadlockInterval setting.

Сохраняйте имена пользователей и пароли в реестре

Сохраняйте имена пользователей и пароли в реестре

Для шифрования имён пользователей и паролей и хранения их в реестре установите имя пользователя и пароль следующим образом.

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

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

Часть строки, которая идёт после реестра ключевых слов и перед запятой, указывает название ключа реестра, который ASP.NET открывается. Часть после запятой содержит имя строкового значения, из которого ASP.NET считывает учетные данные. Требуются запятой, а учетные данные должны храниться в конфигурационном блоке HKLM. Если конфигурация неправильно отформатирована, ASP.NET не начнёт рабочий процесс и впоследствии появится на пути кода неудачи при создании текущего счета.

Учетные данные должны быть в 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