将对象设置为null是否会导致C#垃圾收集器释放它占用的内存
本文关键字:释放 收集器 内存 设置 对象 null 是否 | 更新日期: 2023-09-27 18:26:08
我有一个方法被多次重复调用。
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
将使字符串集合可用于垃圾收集,但不会立即释放内存。当内存不足时,将调用垃圾回收器。如果函数文件[]的范围太大,一种方法是只获取您需要的文件。
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
将可用于垃圾收集。
我不太确定,但为什么不尝试使用List<string>
而不是string[]
呢。这应该可以改善记忆力:)请告诉我这对你是否有效。