У меня есть метод, который вызывается много раз, неоднократно.
public FilesCollection loadCollectionFromDirectory(string directory)
{
string errorMessage;
FilesCollection collection = new FilesCollection(_collectionType);
string[] files = Directory.GetFiles(directory);
foreach (string file in files)
{
if(file.EndsWith(".dll"))
collection.AddNewFileToCollection(file, out errorMessage);
}
files = null;
return collection;
}
Я почти уверен, что метод, вызывающий этот метод, поглощает тонну памяти из-за массива строк, который инициализируется каждый раз, когда этот метод запускается. Насколько я понимаю, каждый раз, когда этот метод запускается снова, массив строк устанавливается в новую коллекцию строк, а старые строки остаются в памяти, пока до них не доберется сборка мусора. Это правильно? Насколько я могу судить, сборка мусора до них не доходит достаточно быстро. Есть множество других проблем, влияющих на исключение Out Of Memory, которое я получаю, но я думаю, что слишком много «призрачных строк» является одной из серьезных причин. Если я установлю files = null, как я делаю сейчас, приведет ли это к более раннему выполнению GC? Я неправильно понял основы сборки мусора и управления памятью?
Я полагаю, мой самый большой вопрос: если я снова и снова выполняю string[] files = Directory.GetFiles(directory), ничего не делая с массивом, не приведет ли это к тому, что моя система будет забита кучей строк-призраков?
files
, становится недостижимым в одно и то же время... в последний раз, когда цикл читает из него. Он уже подлежит сбору до того, как будет достигнута вашаfiles = null;
строка. - person Ben Voigt   schedule 09.12.2015