Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 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 Система переповнення пам'яті пулу додатків.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 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 для вашого додатку.

Часове значення форматується як «години:хвилини:секунди». Якщо дати лише одне число без двокрапки, це значення вважається хвилинами; Отже, тайм-аут="4" еквівалентний тайм-ауту="00:04:00".

Якщо ASP.NET додаток викликає перезапуск ASP.NET робочих процесів (Aspnet_wp.exe у Windows 2000 і Windows XP Professional і W3wp.exe на Windows Server 2003) і дає повідомлення про помилку, що перезавантаження відбувається через підозру в глухому сітку, це має збільшитися відповідьDeadlockВстановлення інтервалу.

Зберігайте імена користувачів і паролі в реєстрі

Зберігайте імена користувачів і паролі в реєстрі

Щоб зашифрувати імена користувачів і паролі та зберегти їх у реєстрі, встановіть ім'я користувача та пароль наступним чином.

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