2010-06-01 3 views
1

Это связано с недавними сообщениями о событиях и управлении памятью в целом. Я задаю новый вопрос, так как не думаю, что используемое мной программное обеспечение имеет какое-либо отношение к общей проблеме, и я пытаюсь понять немного больше о том, как правильно управлять вещами. Это ASP.NET.Объектные отношения

Я пытался понять потребности в Dispose/Finalize в течение последних нескольких дней и считаю, что у меня есть этап, на котором я очень доволен, когда мне следует/не следует реализовать Dispose/Доработка. «Если у меня есть члены, которые реализуют IDisposable, явное обращение к их распоряжению в моем методе размещения», похоже, я понимаю. Итак, теперь я думаю, может быть, мое понимание жизни объектов и того, что держится за то, что просто неправильно!

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

Итак, у меня есть класс репозитория, в нем у меня есть DataContext, который я создаю при создании репозитория. Я реализую IDisposable, и когда мой объект вызова завершен, я вызываю Dispose в моем репозитории и явно вызываю DataContext.Dispose(). Теперь один из методов этого класса создает и возвращает список объектов, которые возвращаются мне на передний план.

Передняя часть -> Контроллер -> Репозиторий -> Контроллер -> Передняя часть.

(Использование Redgate Memory Profiler, я беру снимок моего программного обеспечения при первой загрузке страницы). Мой внешний интерфейс создает объект контроллера при загрузке страницы, а затем отправляет запрос в репозиторий, отправляя обратно список элементов. Когда страница заканчивается загрузкой, я вызываю Dispose на контроллере, который в свою очередь вызывает dispose в контексте. На мой взгляд, это должно означать, что мое соединение закрыто и что у меня нет экземпляров моего класса контроллера. Если я обновляю страницу, она перескакивает на два экземпляра «Live» класса контроллера. Если я посмотрю на график хранения объектов, объекты, которые я создал в моем вызове в списке, удерживаются в конечном счете по тому, что выглядит как Linq.

Контроллер/хранилище в стороне, если я создаю список объектов где-нибудь, или я создаю объект и возвращаю его где-то, могу ли я просто предположить, что .NET в конечном итоге придет и очистит вещи для меня или есть лучшая практика? «Живые» экземпляры подсказывают мне, что они все еще находятся в памяти и активных объектах, тот факт, что RMP, по-видимому, заставляет GC ничего не значит?

+0

Не могли бы вы пояснить, что вы подразумеваете под «активными» или «живыми» объектами? Вы имеете в виду, что по-прежнему существует ссылка на ссылку, доступную из корня? Как правило, объекты без ссылок очищаются просто отлично, хотя есть случаи (особенно при регистрации обработчиков событий), где вы можете оставить обвисшую ссылку, не намереваясь это сделать. В цепочке делегатов сохраняется ссылка на класс регистрации, который может часто приводить к утечке памяти. –

+0

Я имею в виду, что RMP сообщает как Live экземпляры. Он показывает экземпляры, созданные с момента последнего моментального снимка, а затем количество живых экземпляров. В моем случае, я вижу, что было увеличение на 1 экземпляр для всего двух живых экземпляров. – Hammerstein

ответ

1

Если объекты больше не укоренены, они в конечном итоге будут удалены из памяти в целом, но вызов Dispose не приведет к тому, что объект будет полностью удален из памяти сразу. Dispose просто позволяет вам очищать неуправляемые ресурсы и ресурсы, которые необходимо освободить как можно скорее.

Другими словами: ваше соединение должно быть закрыто, но в памяти все еще будет «установлен» экземпляр DataContext.

Возможно, вы захотите read this article о сборке мусора .NET.

+0

Спасибо за ссылку на статью. Я нашел несколько статей о Simple-Talk, и они все были очень полезны. – Hammerstein

1

Мой ответ на ваши вопросы состоит из 2-х частей:

  1. Как разработчик приложения, вы никогда не должны были бы выполнять GC самостоятельно. Это до .NET. В методе Dispose() вам потребуется только освободить или освободить ресурсы, которые вы приобрели, но не требуется вызывать какой-либо метод для сбора мусора явно. Если вы это сделаете, в лучшем случае, когда это будет сделано, это будет недетерминированным.

  2. Когда ваш контроллер вернет список на передний конец , помните, что передняя часть не нуждается в знании о том, что такое серверная (бэкэнд) технология. Это может быть C#, Java, PHP, вы получаете идею. Ответ, который backend возвращает на передний конец, является просто ответом HTTP и соответствует протоколу HTTP. Поэтому, как только ответ создается и возвращается во внешний интерфейс, метод контроллера выходит за пределы области видимости, объекты в этой области собраны для сбора мусора. В этой ситуации вам не придется беспокоиться об утечке памяти.

Смежные вопросы