Entity Framework - удаленный ObjectContext не собирается мусором - PullRequest
2 голосов
/ 29 декабря 2011

Как следует из названия, я недавно обнаружил, что когда я пытался отследить потенциальные проблемы утечки памяти, удаленный объектный контекст не выглядит как сборщик мусора.Я использую EF 4 в приложении WPF вместе с Prism и MVVM.И когда я начал искать решения, я наткнулся на этот пост: http://connect.microsoft.com/VisualStudio/feedback/details/666304/memory-leakage-issue-in-entity-framework

Все мои объектные контексты для каждой транзакции используются внутри блока using.Я все время предполагал, что объектный текст будет удален и в конечном итоге будет собран GC.Видимо только первая часть этого происходила (я использую memprofiler).Может кто-нибудь указать мне на ресурс или сообщить мне, как GC может собирать удаленные объектные контексты.

Ответы [ 2 ]

3 голосов
/ 29 декабря 2011

Сборка мусора и удаление - это два разных аспекта управления памятью.

Dispose - это метод в вашем классе, где вы можете высвободить ресурсы вручную.

Сборка мусора происходит только тогда, когда ядро ​​сборки мусора .NET решает запустить. Обычно рекомендуется не пытаться возиться с этим процессом. Сборщик мусора будет работать только тогда, когда какая-то эвристика скажет ему, что у вас недостаточно памяти, чего на современном оборудовании может никогда не быть (особенно если вы работаете на 64-битной машине).

Если вы хотите поиграть с принудительным сбором, вы можете использовать:

GC.Collect();

Подробнее здесь:

http://msdn.microsoft.com/en-us/library/xe0c2357.aspx

0 голосов
/ 29 декабря 2011

Я нашел эту последовательность вызовов полезной для принудительного запуска GC.

GC.GetTotalMemory(false);
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.GetTotalMemory(true);

try
{
    Process curProc = Process.GetCurrentProcess();
    curProc.MaxWorkingSet = curProc.MaxWorkingSet;
}
catch (Exception)
{
}

Однако, читая статью о Microsoft Connect, с которой вы связались, не работает GC не проблема этого пользователя.То, что делал этот пользователь, вставляет класс сущности в Session, что является ужасным шагом и не позволит распоряжаться родительским классом по причинам, указанным в ответе (отслеживание изменений).

Сеансовый сохраненный объект должен быть отключенным классом, а не тем, что вы извлекаете из контекста.Пока вы этого не делаете, ваш объектный контекст будет удален, когда будет выпущена последняя ссылка на что-либо, что вы извлекли из него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...