我有一个多次被多次调用的方法。
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(目录)而不对数组做些什么,这会导致一堆鬼串堵塞我的系统吗?
答案 0 :(得分:2)
使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
将可用于垃圾收集。
答案 1 :(得分:0)
我不确定,但为什么不尝试使用List<string>
代替string[]
。这应该是关于记忆的诀窍:)请告诉我这是否适合你。