【发布时间】:2013-04-15 01:32:16
【问题描述】:
我创建了一个示例 C# 控制台应用程序,它读取字节数组中的文件数据并将字节数组转换为十六进制字符串。它需要巨大的内存,并且在工作完成后它不会释放内存,我还将正在使用的变量无效。
这里是示例代码:
string filename = @"F:\\AVSEQ09.DAT"; //file size is 32 MB
string hexData = null;
byte[] fileDataContent = File.ReadAllBytes(filename);
if (fileDataContent != null)
hexData = BitConverter.ToString(fileDataContent);
fileDataContent = null;
hexData = null;
//GC.Collect();
Console.ReadKey();
如果我运行此代码,它需要 433 MB 的私有工作集,如果我取消注释 GC.collect 调用,则内存将降至 6 MB。为什么我必须显式调用 GC.collect,显式调用 GC.collect 是否不好,如何在不调用 GC.collect 的情况下释放内存(至 6 MB)?
【问题讨论】:
-
"为什么我必须显式调用 GC collect" - 你不需要。而且不应该。
-
之前也问了无数次....
-
是的,确实如此。 @MitchWheat
-
你真的必须一次读取整个文件吗?
-
GC 最终会释放它(假设您不断分配足够的新对象)。如果您想使用您的额外信息及时释放它,您需要手动调用它。但我推荐
GCCollectionMode.Optimized。