Подтвердить что ты не робот

Как свободная память используется большим списком в С#?

У меня есть список под названием Population, это отличный список из очень многих позиций, и в какой-то момент я перестаю его использовать. Как я могу освободить ресурсы? Затем это часть кода:

 private List <BasePopulation> Population=new List <BasePopulation>();
 Population.SomeMethod();
 Population.Clear();

Я использовал метод Clear, но не работает. Любая идея?

4b9b3361

Ответ 1

Проблема может заключаться в том, что Clear не делает то, что вы думаете. Clear просто помечает List как пустой, не изменяя размер внутреннего массива, который он использует за кулисами. Однако он удалит все ссылки на отдельные экземпляры BasePopulation. Поэтому, если никакая другая структура данных не ссылается на них, они будут иметь право на сбор мусора. Но он не не уменьшит размер List напрямую. Я просто проверил это с помощью ILSpy.

У вас есть два варианта.

  • Установите Population = null. Это приведет к выкручиванию всего экземпляра объекта, что делает его пригодным для сбора мусора.

  • Вызовите TrimExcess на этом List. Это изменит размер внутреннего массива.

Ответ 2

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

Population = null;

Если этого недостаточно для вас, например, потому что вы действительно готовы избавиться от объектов сейчас, и вы можете принять неоптимальный пробег, вы можете сказать, что GC начнет собирать объекты сейчас через

GC.Collect();

Дополнительную информацию об этом методе можно найти здесь.

Как указано выше, эта практика может привести к снижению производительности, поскольку она заставляет GC очищать ресурсы в точке программы, где обычно не будет. Поэтому прямое обращение к методу часто не рекомендуется, но оно может удовлетворить ваши потребности, если это действительно особый момент в вашем приложении. В качестве практического примера я успешно улучшил использование пиковой памяти в программе, которая требует много объектов во время инициализации, которые могут быть отброшены после запуска реального запуска программы. Здесь небольшое оправдание производительности при вызове GC.Collect() после инициализации было оправданным.

Ответ 3

Лучшее, что вы могли бы сделать, это ничего. Garbage Collector GC автоматически выполняет эту работу для вас. Поскольку List не IDisposable, вы не можете его уничтожить.

Clear просто удалил бы элементы из списка, но не удалил бы его.

Ответ 4

Измените, перепишите мой ответ об Disposing. Хорошо, я, должно быть, думал о вещах, когда набирал "Чистый". Я предполагаю, что если очистка всех элементов из вашего списка не является свободными ресурсами, то ресурсы, которые вы пытаетесь высвободить, неуправляемы. Исходя из этого предположения, вам понадобится BasePopulation для реализации IDisposable, поэтому, когда этот объект будет собран сборщиком мусора, эти ресурсы могут быть освобождены.

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