将对象设置为null是否会导致C#垃圾收集器释放它占用的内存?
我有一个方法可以多次重复调用将对象设置为null是否会导致C#垃圾收集器释放它占用的内存?,c#,string,memory,null,garbage,C#,String,Memory,Null,Garbage,我有一个方法可以多次重复调用 public FilesCollection loadCollectionFromDirectory(string directory) { string errorMessage; FilesCollection collection = new FilesCollection(_collectionType); string[] files = Directory.Get
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;
}
我很确定调用这个方法的方法会占用大量内存,因为每次这个方法运行时都会初始化字符串数组。据我所知,每次再次运行此方法时,字符串数组都被设置为一个新的字符串集合,旧字符串将保留在内存中,直到垃圾回收到达它们为止。对吗?据我所知,垃圾收集的速度还不够快。还有很多其他的问题会影响我得到的内存不足异常,但我认为太多的“幽灵字符串”是一个重要原因。如果我像现在这样设置files=null,是否会导致GC更早发生?我是否误解了垃圾收集和内存管理的基本原理
我想我最大的问题是-如果我反复使用string[]files=Directory.GetFiles(Directory)而不使用数组,这会导致一堆重影字符串阻塞我的系统吗?使
files=null
将使字符串收集可用于垃圾收集,但不会立即释放内存。内存不足时调用垃圾收集器。如果函数file[]的范围太大,一种方法是只获取您需要的文件
public FilesCollection loadCollectionFromDirectory(string directory)
{
string errorMessage;
FilesCollection collection = new FilesCollection(_collectionType);
string[] files = Directory.GetFiles(directory,"*.dll");
foreach (string file in files)
{
collection.AddNewFileToCollection(file, out errorMessage);
}
// files = null;
return collection;
}
无论您是否将其设置为
null
,当函数作用域结束时,本地变量文件
将可用于垃圾收集。我不太确定,但为什么不尝试使用列表
而不是字符串[]
。这应该可以解决内存问题:)请让我知道这是否对您有效。由文件引用的数组的可能重复项同时变得不可访问,无论是哪种方式。。。循环最后一次从中读取时。在您的files=null之前,它已符合收集条件代码>行被击中。@BenVoigt所以它应该被自动收集?根据VisualStudio内部的内存分析器工具,我的系统存在的一个问题是在程序运行过程中分配了许多字符串类型。我认为这是内存不足异常后系统挂起问题的一部分。@handlethat错误,但您的问题不在您发布的代码中。我们如何帮助修复它呢?如果一个对象超出了作用域,那么每当垃圾收集器“感觉到它”时,内存就会被回收。对于“files”数组,当离开该方法时,它将超出范围,因此无需将其设置为NULL,因为没有对它的进一步引用。返回的“FileCollection”会发生什么情况?这不会对内存消耗产生影响,因为List
基本上是数组的包装器,所有元素都将保留在内存中。谢谢,我一直认为,当你谈论内存时,这个列表会更好一些:)关于GetFiles的第二个参数的好建议。我会尝试一下。@HandleThatError另外,如果您使用的是大文件集,Directory.EnumerateFiles
可能比Directory.GetFiles
更有效。