system outofmemoryexception как исправить
Исправление: Возникает исключение System.OutOfMemoryException или IDE отвечает медленно после построения решения, содержит несколько раз во многих проектах WPF с помощью платформа.NET Framework 3.5 SP1
Симптомы
Создавать сложные решения, содержащего много проектов Windows Presentation Foundation (WPF), основанных на Microsoft платформа.NET Framework 3.5 Пакет обновления 1 (SP1). При каждом построении решения, увеличивается использование памяти процесса devenv.exe. После построения решения несколько раз появиться одно или несколько из следующих проблем:
Исключение типа «System.OutOfMemoryException».
При нажатии любой кнопки в Интегрированной среде разработки IDE медленно реагирует и даже сбоям.
Примечание. Данная проблема возникает даже в том случае, когда XAML-файлы не открыть.
Причина
Эта проблема возникает из-за фрагментации памяти между библиотекой классов платформа.NET Framework и средства синтаксического анализа XAML.
Решение
Сведения об исправлении
Существует исправление от корпорации Майкрософт. Однако данное исправление предназначено для устранения только проблемы, описанной в этой статье. Применяйте это исправление только в тех случаях, когда наблюдается проблема, описанная в данной статье. Это исправление может проходить дополнительное тестирование. Таким образом если вы не подвержены серьезно этой проблеме, рекомендуется дождаться следующего пакета обновления, содержащего это исправление.
Если исправление доступно для скачивания, имеется раздел «Пакет исправлений доступен для скачивания» в верхней части этой статьи базы знаний. Если этот раздел не отображается, обратитесь в службу поддержки для получения исправления.
Примечание. Если наблюдаются другие проблемы или необходимо устранить неполадки, вам может понадобиться создать отдельный запрос на обслуживание. Стандартная оплата за поддержку будет взиматься только за дополнительные вопросы и проблемы, которые не соответствуют требованиям конкретного исправления. Чтобы получить полный список телефонов поддержки и обслуживания клиентов корпорации Майкрософт или создать отдельный запрос на обслуживание, посетите следующий веб-сайт корпорации Майкрософт:
http://support.microsoft.com/contactus/?ws=supportПримечание. В форме «Пакет исправлений доступен для скачивания» отображаются языки, для которых доступно исправление. Если нужный язык не отображается, значит исправление для данного языка отсутствует.
Предварительные условия
Платформа.NET Framework 3.5 с пакетом обновления 1 для установки этого исправления необходимо иметь.
Необходимость перезагрузки
Необходимо перезагрузить компьютер после установки исправления, если используется не экземпляр платформа.NET Framework.
Сведения о замене исправлений
Это исправление не заменяет других исправлений.
Сведения о файлах
Английская версия данного исправления содержит атрибуты файла (или более поздние атрибуты файлов), приведенные в следующей таблице. Дата и время для этих файлов указаны в формате общего скоординированного времени (UTC). При просмотре сведений о файле, он преобразуется в локальное время. Чтобы узнать разницу между временем по Гринвичу и местным временем, откройте вкладку Часовой пояс элемента Дата и время в панели управления.
Устранение неполадок из-за проблем с памятью (System.OutOfMemoryException) в ASP.NET
Эта статья поможет устранить ошибки в памяти в ASP.NET.
Оригинальная версия продукта: ASP.NET
Исходный номер КБ: 2020006
Симптомы
Одной из наиболее распространенных проблем, которые мы видим в службах поддержки клиентов Майкрософт, являются OutOfMemoryException сценарии. Таким образом, мы собрали коллекцию ресурсов для устранения неполадок и выявления причин проблем с памятью.
32-битный процесс, работающий в 64-битной оперативной системе, может обрабатывать 4 ГБ памяти в режиме пользователя, а 64-битный процесс, работающий в 64-битной оперативной системе, может обрабатывать 8 ТБ памяти в режиме пользователя, поэтому OOM в 64-битной оперативной системе не является вероятным. Можно испытать OOM в 32-битном процессе, запущенном в 64-битной оперативной системе, но обычно это не происходит до тех пор, пока этот процесс не будет использовать около 3 ГБ частных битов.
Существует две причины, по которым может возникнуть состояние OOM.
Кроме того, можно увидеть состояние OOM из-за сочетания 1 и 2. Дополнительные сведения см. в дополнительных сведениях в области устранения неполадок System.OutOfMemoryExceptions в ASP.NET.
Когда возникает OOM, вы можете заметить один или несколько следующих симптомов:
Ваше приложение сбои. Дополнительные сведения см. в Кто это парень OutOfMemoryи почему он делает мой процесс аварии, когда у меня есть много памяти осталось?.
В вашем приложении может быть высокая память, как указано диспетчером задач или монитором производительности.
Обработка запросов может занять много времени.
В службы IIS (IIS) 7 для устранения длительных запросов можно использовать устранение неполадок с помощью отслеживания в IIS 7.
Пользователи могут сообщать об ошибке в приложении из-за OOM.
Когда дело доходит до определения причины для состояния OOM, вы на самом деле работаете, чтобы определить причину или с высокой памятью или фрагментированное пространство адресов. Хотя мы не можем документировать все возможные причины этих ситуаций, существуют некоторые распространенные причины, которые мы регулярно видим.
В следующей информации описаны общие причины условий OOM и решения по устранению каждой из этих причин.
Объединение строк
Чтобы избежать OOM из-за конкатетаций строк, убедитесь, что вы используете StringBuilder класс. Дополнительные сведения см. в дополнительных сведениях о том, как повысить производительность контатацийстрок в Visual C#.
Фрагментация управляемой кучи
Сборщик мусора (GC) в управляемом приложении уплотняет кучи, чтобы уменьшить количество фрагментации. Однако можно закрепить объекты в управляемом приложении. Закрепленные объекты не могут быть перемещены во время уплотнения кучи. Это изменит адрес, на котором расположен объект. Если приложение пин-коды большое количество объектов, и / или он пин-коды объектов в течение длительного времени, это может привести к фрагментации в управляемой кучи. Это может привести к более частому выращиванию управляемой кучи и к состоянию OOM.
Фрагментация в пространстве Виртуальный адрес (VA)
Каждый процесс имеет определенное количество памяти, выделенной ему, и эта память представляет собой пространство va для этого процесса. Если пространство va становится фрагментарным, это повышает вероятность того, что GC не может получить большой блок сопоставляемой памяти для роста управляемых кучи. И это может привести к состоянию OOM.
Фрагментация в пространстве VA часто вызвана одним или несколькою из следующих сценариев:
Загрузка одинаковых сборок в несколько доменов приложений.
Если требуется использовать сборку в более чем одном приложении, запущенной в одном пуле приложений, назови сборку и установите ее в GAC. При этом убедитесь, что сборка загружается только один раз в процесс.
Возвращение больших наборов данных
При использовании данных из базы данных или другого источника данных важно ограничить количество возвращенных данных. Например, кэшинг результата запроса, который возвращает всю таблицу баз данных, чтобы избежать затрат на сбор частей данных из базы данных, когда это необходимо, не является хорошим подходом. Это может легко вызвать высокую память и привести к состоянию OOM. Разрешение пользователю запускать аналогичный запрос — это еще один распространенный способ создания ситуации с высокой памятью. Например, возвращаем всех сотрудников в компании или всех клиентов в штате Техас с фамилией, начиная с буквы S.
Не менее важно убедиться, что в элементах пользовательского интерфейса, таких как управление GridView, не отображается результат больших данных. Помимо памяти, необходимой для возвращенных данных, вы также будете потреблять большие объемы данных в строках и элементах пользовательского интерфейса, необходимых для отображения результатов. Реализуя сбор и проверку входных данных, чтобы не возвращать большие наборы данных, можно избежать этой проблемы.
Запуск в производственной среде с включенной трассировой
ASP.NET отслеживание — это мощная функция для устранения неполадок приложений. Но его нельзя оставить в производственной среде. ASP.NET отслеживание использует структуры данных, такие как хранение данных трассировки, и со временем они могут вызывать состояние высокой памяти, которое может привести к DataTables OOM.
Трассировка должна быть отключена в производственной среде. Это можно сделать, установив атрибут элемента false enabled
Утечка родных ресурсов
Многие управляемые ресурсы также будут использовать местные ресурсы. Поскольку GC не очищает местные ресурсы, разработчик отвечает за реализацию и вызов метода Dispose для очистки местных ресурсов. Если используется тип, реализующий интерфейс, и метод не вызывается, вы рискуете утечь родной ресурс и вызвать состояние IDisposable Dispose OOM.
Эти объекты должны реализовать интерфейс, и вы должны вызвать метод на этих объектах, iDisposable когда они больше не Dispose нужны.
Многие пользователи ПК во время работы с какой-либо программой могут столкнуться с «вылетом» указанной программы, и появившимся сообщением «Out of memory». Возникшая проблема может иметь множество причин, начиная от банального недостатка памяти на пользовательском ПК, и заканчивая некорректной работой с памятью какой-либо программы.
Причины появления дисфункции
Сообщение «Out of memory» (в переводе дословно «вне памяти», или «недостаточно памяти») обычно возникает при недостатке памяти на пользовательском компьютере. В частности же, в появлении данной ошибки «виновен» следующий набор факторов:
Когда вашему компьютеру не хватает физической R.A.M. памяти, он заимствует часть места на жёстком диске, и создаёт так называемую «виртуальную память». Система временно хранит в такой виртуальной памяти ту часть данных, которая не помещается в памяти обычной. Такие данные обычно хранятся в файле «pagefile.sys», размер которого может увеличиваться или уменьшаться в зависимости от специфики работы вашей ОС. Если на диске будет недостаточно места, файл «pagefile.sys» не сможет расти, и пользователь получит рассматриваемую ошибку.
Как исправить ошибку «Out of memory»
Для решения указанной проблемы рекомендую сделать следующее:
Альтернативным вариантом решения проблемы является установка соответствующего фикса от Майкрософт. Или использование расширений или дополнений для браузера уровня «The Great Suspender» для «Google Chrome», хорошо работающего с ненужными вкладками браузера.
bcdedit/set IncreaseUserVa 3072
И нажмите на ввод, и перезагрузите ваш ПК. Функционал данной команды позволяет выделить пользовательским приложениям 3 гигабайта оперативной памяти для работы. В некоторых системах этого может быть слишком много, потому если после ввода данной команды система начала чаще сбоить, то введите в командной строке от имени администратора:
bcdedit /set IncreaseUserVa 2560 — что позволит задействовать 2,5 гигабайта вместо ранее забронированных 3.
Если ситуацию этим исправить не удалось, верните настройки на состояние по умолчанию:
bcdedit /deletevalue IncreaseUserVa
Установите нужный размер файла подкачки
Заключение
Ошибка «Out of memory» может иметь множество причин, связанных как с физическим недостатком памяти на ПК, так и другими детерминантами, изложенными мной выше. Для решения проблемы советую закрыть ненужные программы (вкладки браузера) на вашем компьютере (тем самым разгрузив его память), а самым эффективным инструментом является установка дополнительной планки памяти на ПК, что в большинстве случаев поможет избавиться от ошибки на вашем компьютере.
— Система.OutOfMemoryException » был выброшен, когда еще много свободной памяти
исключение: Исключение типа ‘System.OutOfMemoryException’ был брошен.
у меня есть память 4GB на этой машине 2.5 GB бесплатно когда я запускаю этот запуск, на ПК явно достаточно места для обработки 762 Мб 100000000 случайных чисел. Мне нужно сохранить как можно больше случайных чисел, насколько это возможно, учитывая доступную память. Когда я пойду в производство, на коробке будет 12GB, и я хочу использовать он.
ограничивает ли CLR меня максимальной памятью по умолчанию для начала? и как я могу просить больше?
обновление
Я думал, что разбить это на меньшие куски и постепенно добавлять к моим требованиям памяти поможет, если проблема связана с фрагментации памяти, но не Я не могу пройти мимо общего размера ArrayList 256mb независимо от того, что я делаю настройки размер блока.
из моего основного метода:
13 ответов
короче говоря, и очень упрощенный, «из памяти» на самом деле не означает, что объем доступной памяти слишком мал. Наиболее распространенной причиной является то, что в текущем адресном пространстве нет смежной части памяти, которая достаточно велика для обслуживания требуемого распределения. Если у вас есть 100 блоков, каждый 4 MB большой, это не поможет вам, когда вы нужен один блок 5 Мб.
Ключевые Моменты:
У вас нет непрерывного блока памяти для выделения 762 МБ, ваша память фрагментирована, и распределитель не может найти достаточно большое отверстие для выделения необходимой памяти.
64-битные процессы не имеют этого ограничения, поскольку они используют 64-битные указатели, поэтому их теоретическое максимальное адресное пространство (размер их виртуальной памяти) 16 экзабайт (2^64). В действительности Windows x64 ограничивает виртуальную память процессов 8 ТБ. Решение проблемы ограничения памяти заключается в компиляции в 64-разрядной версии.
однако размер объекта в Visual Studio по-прежнему ограничен 2 ГБ, по умолчанию. Вы сможете создать несколько массивов, общий размер которых будет больше 2 ГБ, но вы не можете по умолчанию создавать массивы больше 2 ГБ. Надеюсь, если вы все еще хотите создать массивы больше 2GB, вы можете сделать это, добавив следующий код для вас приложение.конфигурационный файл:
как вы наверное поняли, вопрос заключается в том, что вы пытаетесь выделить один большой непрерывный блок памяти, который не работает из-за фрагментации памяти. Если бы мне нужно было сделать то, что вы делаете, я бы сделал следующее:
другой вариант, если вы всегда получаете доступ к значениям в порядке может быть использовать перегруженный конструктор указать семени. Таким образом, вы получите полу случайное число (например, DateTime.Now.Ticks ) сохраните его в переменной, затем, когда вы начнете просматривать список, вы создадите новый случайный экземпляр, используя исходное семя:
важно отметить, что в то время как блог, связанный в ответе Фредрика Мерка, указывает, что проблема обычно связана с отсутствием адресного пространства он не перечисляет ряд других проблем, таких как ограничение размера объекта CLR 2GB (упомянутое в комментарий от ShuggyCoUk в том же блоге), замалчивает фрагментацию памяти и не упоминает о влиянии размера файла страницы (и как его можно решить с помощью CreateFileMapping функции).
поскольку большинство программ запрашивают рабочую память из ОС и не запрашивают сопоставление файлов, они будут ограничены ОЗУ системы и размер файла подкачки. Как отмечается в комментарии Нестора Санчеса (Néstor Sánchez) в блоге, с управляемым кодом, таким как C#, вы застряли в ограничении файла RAM/page и адресном пространстве операционной системы.
это было намного дольше, чем ожидалось. Надеюсь, это кому-то поможет. Я отправил его, потому что я столкнулся с System.OutOfMemoryException запуск программы x64 в системе с 24 ГБ ОЗУ, хотя мой массив содержал только 2 ГБ материала.
Я бы посоветовал не использовать параметр загрузки / 3GB windows. Помимо всего прочего (это перебор, чтобы сделать это для один плохо себя ведет приложение, и это, вероятно, не решит вашу проблему в любом случае), это может вызвать много нестабильности.
многие драйверы Windows не тестируются с этой опцией, поэтому многие из них предполагают, что указатели пользовательского режима всегда указывают на нижний 2GB адресного пространства. Это означает, что они могут сломаться ужасно с /3GB.
, Windows обычно ограничивает 32-разрядный процесс адресным пространством 2 ГБ. Но это не означает, что вы должны ожидать, что сможете выделить 2GB!
адресное пространство уже завалено всевозможными выделенными данными. Есть стек и все загруженные сборки, статические переменные и так далее. Нет никакой гарантии, что будет 800 МБ непрерывной нераспределенной памяти в любом месте.
выделение 2 400MB кусков, вероятно, будет лучше. Или 4 200mb кусков. Меньшие выделения намного проще найти место для фрагментированного пространства памяти.
в любом случае, если вы собираетесь развернуть это на машине 12GB в любом случае, вы захотите запустить это как 64-разрядное приложение, которое должно решить все проблемы.
изменение с 32 на 64 бит работало для меня-стоит попробовать, если вы находитесь на 64-битном ПК, и ему не нужно порт.
Если вам нужны такие большие структуры, возможно, вы могли бы использовать сопоставленные с памятью файлы. Эта статья может оказаться полезной: http://www.codeproject.com/KB/recipes/MemoryMappedGenericArray.aspx
вместо выделения массивного массива, не могли бы вы попробовать использовать итератор? Они выполняются с задержкой, то есть значения генерируются только так, как они запрашиваются в инструкции foreach; вы не должны запускать память таким образом:
выше будет генерировать столько случайных чисел, сколько вы хотите, но только генерировать их, как их просят через оператор foreach. Так у тебя память не кончится.
С другой стороны, если вы должны иметь их все в одном месте, хранить их в файле, а не в памяти.
Windraw dot Net
Победа OutOfMemoryException
Довольно долго мы боролись за производительность программы WinDraw, а именно за взаимодействие между WinDraw и MS SQL Server.
За время этой борьбы мы сделали несколько серьезных выводов:
1. Использование метода dbo.ZipUnPack в запросах(то есть на стороне SQL Server) построителя отчетов Stimulsoft Reports.Net приводил к тому, что ошибка System.OutOfMemoryException появлялась гораздо чаще. Переведя выполнение этого метода на сторону сервера приложений (т.е. используя Atechnology.Components.ZipArchiver.UnZip2 (byte[] classnative) ) мы значительно увеличили время работы SQLServer без перезагрузки.
2. Железный апгрейд не решает проблему System.OutOfMemoryException, доказано опытным путем. А именно, с момента первого описания проблемы (Проблема производительности WinDraw. ) мы приобрели новый сервер — Hewlett Packard Proliant DL380G6 (2xXeonQC, 32Gb оперативной памяти), на котором установили Microsoft Windows Server 2003 Ent, Microsoft SQL Server 2008 Ent. В настройках Microsoft SQL Server включили опцию Address Windowing Extensions (AWE). Уже на следующий день мы получили ошибку System.OutOfMemoryException, причем судя по Task Manager оперативная память была использована всего НАПОЛОВИНУ.
Исходя из всего этого, и множества советов в интернете(правда большинство советов относилось к работе программы 1С с SQL Server, но проблема была очень похожа на нашу) — решено было попробовать использовать x64 платформу и ПО.
На Этот же самый сервер (Hewlett Packard Proliant DL380G6 (2xXeonQC, 32Gb оперативной памяти)) была установлена операционная система Microsoft Windows Server 2008 R2 Enterprise x64, Microsoft SQL Server 2008 R2 x64, опция Address Windowing Extensions (AWE) выключена (кстати пришла идея попробовать включить и ее. ). Итог потрясающий.
Уже больше месяца мы не получали ошибки System.OutOfMemoryException, хотя оперативная память используется практически полностью!
Исходя из этого данный набор ПО считаем необходимым при одновременном доступе к SQL Server более 30 пользователей.
З.Ы. В ближайшее время попробуем включить опцию Address Windowing Extensions (AWE) и опишем результат!
Немного технической информации!
Механизм Address Windowing Extensions (AWE), используемый в SQL Server, состоит из двух частей, распределяющих физическую память и отображающую её на Virtual Address Space (VAS) данного процесса. Если физическая память распределена, то операционная система уже не сможет её затребовать, пока использующий её процесс не будет завершён или этот процесс освободит память, вернув её операционной системе. Приложение может управлять и даже полностью предотвращать листание. Преимущество механизма mapping/unmapping в том, что одна и та же физическая страница может быть отображена на разные участки VAS. На 64-х битных платформах в unmapping нет необходимости, поскольку VAS мы имеем достаточно, чтобы вместить всю имеющуюся физическую память.
Из теории операционных систем, для описания отображения страницы VAS на физические страницы, система оперирует записями таблицы страниц — Page Table Entry (PTE). Внутри физическая страница описывается номером блока страниц — Page Frame Number (PFN). Из PFN можно получить всю информацию о физической странице, которую он представляет. Например, PFN показывает, какому Non-Uniform Memory Access (NUMA) — узлу принадлежит эта страница. В операционной системе есть база данных, хранящая совокупность PFN, которыми система управляет. Если страница в VAS является закреплённой, существует PTE, который может указывать или не указывать на задействованные PFN. Концептуально, страница, которую представляет PTE, может быть в памяти или нет, например, если она выгружена на диск. В первом случае она привязана к задействованному PFN, а в последнем — нет. В свою очередь, как только физическая страница привязывается к странице в VAS, её PFN возвращаются PTE.
Когда операционная система закрепляет, освобождает, получает/отдаёт страницы задействованного PTE, или должна получить немного информации об этом (например аллокация NUMA), она должно задействовать блокировку рабочего множества процесса — чтобы обеспечить стабильность привязки PTE к PFN. Эта блокировка обходиться довольно дорого и может испортить масштабируемость процесса.
При распределении физических страниц, использование AWE механизма предоставляет нам набор записей PFN непосредственно из базы данных PFN. Операционная система обязана устанавливать блокировку на базу данных PFN во время распределения записей PFN. Используя механизм отображения AWE, Вы можете отобразить аллоцируемые записи PFN на VAS процесса. Когда происходит такое отображение, PTE аллоцируются, привязываются к PFN и отмечаются как блокированые. В этом случае операционная система должна разово установить блокировку рабочего множество процесса. При отображении обычных страниц, операционная система делает это по требованию и, следовательно, должна будет заполучить рабочее множество и установить блокировку в базе данных PFN для каждой страницы. Так как страницы в памяти блокированы, в момент листания эти PTE системой будет игнорироваться.
На 64-х битных платформах лучше называть такие страницы блокированными страницами (locked pages), и, пожалуйста, не путайте их со страницами, блокированными средствами VirtualLock API. Как было описано выше, у блокированных страниц есть два важных свойства — они не участвуют в листании, проводимом операционной системой, и во время распределения они захватывают рабочее множество и устанавливают разовую блокировку в базе данных для PFN.
Первое свойство имеет не очевидное влияние на высокопроизводительные системы, такие, как системы с архитектурой NUMA. Оно приводит к явной резидентности в памяти. Помните, что система закрепляет страницы по требованию. Для распределения физической памяти будет использоваться узел, на котором выполняется обращающийся к памяти поток. Только после этого страница может быть выгружена операционной системой во время свопинга. Далее, она может снова попасть в память, операционная система снова распределит физическую страницу узлу, на котором поток продолжает работать с этой памятью. В этом случае узел может оказаться уже совсем другим. Такое поведение приведет к дополнительной нагрузке на приложения, которые используют для страниц резидентность NUMA. Блокировка страницы позволяет разрешить эту проблему, полностью защищая их от листания.
Второе свойство — захват рабочего множества и блокировка в базе данных только PFN, дает возможность приложениям работать быстрее и повышает масштабируемость пилообразной нагрузки.
В NUMA архитектуре, SQL Server Buffer Pool фиксирует каждую распределенную страницу с выделенным для неё узлом. Достигается этого за счёт использования QueryWorkingSetEx. Как только страница распределена, вызывается этот API, который позволяет узнать детали резидентности страницы. Делается это только один раз. Поэтому включение locked pages для SQL Server на 64-х битной платформе улучшает работу с пилообразной нагрузкой и повышает производительность и масштабируемость на более длительных отрезках времени. При работе SQL Server в режиме locked pages, Вам не нужно больше волноваться о производительности системы в целом, зависимости от изъятия памяти у SQL Server, когда он участвует в механизме листания операционной системы, прослушивая оповещения отвечающего в системе за память API, и сокращая своё рабочее множество, когда это от него требуют.