2013-04-10 2 views
4

Было интересно, может ли кто-нибудь пролить свет на это.Сборка мусора слишком поздно - причины исключений OutOfMemory

У меня есть приложение с большой площадью памяти (& сбой памяти). Нет утечек памяти, и GC, как правило, делают хорошую работу по освобождению ресурсов.

Иногда, однако, GC не происходит «вовремя», вызывая исключение из памяти. Мне было интересно, может ли кто-нибудь пролить свет на это?

Я использовал профилировщик REDGate, что очень хорошо - приложение имеет типичный «пилообразный» узор - OOMs происходят в верхней части пилообразного пиления. К сожалению, профилировщик не может быть использован (AFAIK) для выявления источников оттока памяти.

Возможно ли установить «мягкий предел» памяти, на котором должен быть принудительно установлен GC? В настоящий момент GC выполняется только тогда, когда память находится на своем абсолютном пределе, что приводит к OOM.

+0

Вы использовали http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/, чтобы убедиться, что утечек нет? –

+0

Невозможно обернуть большие части в приложениях или вызвать GC.Collect иногда? – slawekwin

+0

Вы можете заставить GC работать. просмотрите эти [SO post] (http://stackoverflow.com/questions/4257372/how-to-force-garbage-collector-to-run), [еще одно сообщение SO] (http://stackoverflow.com/questions/233596/best-practice-for-forcing-garbage-collection-in-c-sharp) – scheien

ответ

-1

Вы можете использовать GC.collect(), чтобы заставить сборщик мусора выполнять свою работу. Но это не предпочтительнее.

Используйте профили памяти, такие как (memprofiler), чтобы обнаружить утечки. Почти все ваши коды выполняют утечки в некоторых точках.

+4

Пожалуйста, используйте правильное написание. Это не чат. –

1

Если вы используете много памяти и много мусора собираете, я думаю, вы должны рассмотреть шаблон дизайна «Flyweight».

В качестве примера, если вы мусор собираете много строк, см. String.Intern (строка s). Msdn reference

+1

Что такое «легкий» дизайн? – spender

+0

Мне тоже любопытно. У вас есть источник для этого проекта patter @Thomas? –

+0

Первоначально @Thomas писал «легкий шаблон дизайна», возможно, он имел в виду шаблон Flyweight или что-то вроде этого, но при создании некоторых исправлений грамматики я обернул слово «весовое» в фигурные скобки, и это дало нам «легкий», который нас смутил. Простите за это. –

2

Невозможно, чтобы сбор мусора «не произошел вовремя». Они происходят, когда новое распределение памяти подталкивает Gen-0 за определенный предел. Таким образом, они всегда случаются, прежде чем распределение памяти подтолкнет память к ее пределу. Это случается так много раз в день во всем мире, что я был бы удивлен, если бы какие-то ошибки не были хорошо известны.

Считаете ли вы, что на самом деле вы можете выделить больше памяти, чем доступно? OS только позволяет вам получить доступ к 2 ГБ на большинстве 32-битных машин.

Есть некоторые другие возможности:

  1. ли ваше приложение с использованием не-управляемой памяти?
  2. Является ли ваше приложение Закрепление памяти? Если это так, что может вызвать проблему фрагментации, особенно если вы не освобождаете штырь.
+0

Вопрос, кажется, спрашивает, можно ли установить предел. Не могли бы вы добавить информацию о том, как определяется предел Gen-0. Например, он учитывает общую свободную системную память. – crokusek