Клас outofmemoryexception (system)
Необхідно виконати одну з наступних дій, щоб вирішити проблему:
Замініть виклик StringBuilder. StringBuilder (Int32, Int32) конструктор за допомогою виклику будь-яких інших StringBuilder перевантаження конструктора. Максимальна місткість вашої StringBuilder об'єкта буде присвоєно значення за замовчуванням, яке є Int32. MaxValue.
Викличте StringBuilder. StringBuilder (Int32, Int32) конструктор з maxCapacity значення, яке є досить великим, щоб вмістити всіх розширеннях StringBuilder об'єкта.
Ваша програма запускається у вигляді 32-розрядного процесу.
32-розрядні процеси можна виділити більше 2 ГБ пам'яті віртуальної призначеного для користувача режиму в 32-розрядних системах і 4 ГБ пам'яті віртуальної призначеного для користувача режиму в 64-розрядних системах. Це можна зробити більш складним для CLR виділити досить безперервної пам'яті, при необхідності виділення великого. Навпаки 64-розрядних процесів можна виділити до 8 ТБ віртуальної пам'яті. Щоб усунути це виняток, Перекомпілюйте додаток для 64-розрядної платформи. Відомості про призначених для конкретних платформ в Visual Studio см. В розділі Практичний посібник. Налаштування проекту для конкретної платформи.
У додатку існує витік некерованих ресурсів
Хоча збирач сміття може звільнити пам'ять, виділена для керованих типів, він не підтримує управління пам'ять, виділена для некерованих ресурсів, таких як дескриптори операційної системи (включаючи покажчики на файли, відображені в пам'ять файли, канали, розділів реєстру та дескриптори очікування) і блоки пам'яті , виділені безпосередньо за допомогою викликів Windows API або виклики функцій виділення пам'яті, такі як malloc. Типи, які використовують некеровані ресурси реалізовувати IDisposable інтерфейсу.
Якщо, використовують тип, який використовує некеровані ресурси, слід переконатися, що викликається його IDisposable. Dispose метод після завершення його використання. (Деякі типи також реалізують Close метод, ідентичний функції Dispose метод.) Додаткові відомості див. У розділі Using Objects That Implement IDisposable.
Якщо створений тип, який використовує некеровані ресурси, переконайтеся, що реалізації шаблону видалення і, при необхідності, наданий метод завершення. Додаткові відомості див. У розділі Шаблон видалення. Реалізація методу Dispose. і Object. Finalize розділи.
Ви намагаєтеся створити великий масив в 64-розрядному процесі.
За замовчуванням загальномовне Виконавча не дозволяють окремих об'єктів, розмір яких перевищує 2 ГБ. Щоб перевизначити цю поведінку за замовчуванням, можна використовувати параметр файлу конфігурації для включення масивів, загальний розмір яких перевищує 2 ГБ.
Ви працюєте з дуже великими наборами даних (наприклад, масиви, колекції або набори даних для бази даних) в пам'яті.
Якщо структури даних або набори даних, які знаходяться в пам'яті, збільшаться настільки, що загальномовне Виконавча не зможе виділити для них досить безперервної пам'яті, то в результаті буде видано виняток OutOfMemoryException.
Щоб запобігти OutOfMemoryException виключення, необхідно змінити додаток так, щоб менше даних, що знаходяться в пам'яті або дані поділяються на сегменти, які потрібно менше операцій виділення пам'яті. наприклад:
При отриманні даних з бази даних і їх фільтрації в додатку, щоб звести до мінімуму обробки на сервері, слід змінити запити, щоб повернути тільки підмножина даних, необхідний вашому додатку. При роботі з великими таблицями, кілька запитів майже завжди є більш ефективним, ніж вилучення всіх даних в одній таблиці і потім обробка.
При виконанні запитів, які динамічно створити користувачів, слід переконатися, що обмежена числом записів, що повертаються запитом.
Якщо ви використовуєте великих масивів або інших колекцій об'єктів, результати якого розмір в OutOfMemoryException виключення, слід змінити додатки для роботи в підмножин даних, а не для роботи з нею все відразу.
У наступному прикладі повертається масив, який складається з мільйонів 200 значень з плаваючою комою, а потім обчислює їх середнє значення. Вихідні дані прикладу показано, що, так як в прикладі зберігається весь масив в пам'яті, перш ніж він обчислює середнє OutOfMemoryException - створюється виняток.
Кілька разів об'єднанні великих рядків.
Оскільки рядки є незмінними, кожен рядок операції об'єднання створює новий рядок. Для коротких рядків, або для невеликого числа операцій об'єднання вплив незначний. Але для великих рядків або велику кількість операцій об'єднання, об'єднання рядків може привести до велике число операцій виділення пам'яті і фрагментації пам'яті, низька продуктивність і, можливо, OutOfMemoryException виключення.
При об'єднанні великих рядків або виконання великої кількості операцій об'єднання, слід використовувати StringBuilder замість класу String класу. Після завершення обробки рядка перетворити StringBuilder екземпляр в рядок шляхом виклику StringBuilder. ToString метод.
Закріпити велике число об'єктів в пам'яті.
Оцінити, чи виконаний кожен об'єкт потрібно закріпити.
Переконайтеся, що кожен об'єкт незакріплених якомога швидше.
Переконайтеся, що при кожному виклику функції GCHandle. Alloc (Object, GCHandleType) метод пам'ять ПІН-код має відповідний виклик GCHandle. Free метод, щоб скасувати закріплення цієї пам'яті.
OutOfMemoryException використовує значення HRESULT COR_E_OUTOFMEMORY. який має значення 0x8007000E.
Список початкових значень властивостей для примірника OutOfMemoryException. в розділі OutOfMemoryException конструктори.