在我的应用程序中,我正在使用Windows服务读取文件。该服务每秒读取一次文件。 这是我用来读取文件的代码:
public static byte[] GetBytesFromFile(string fullFilePath)
{
FileStream fs = File.OpenRead(fullFilePath);
try
{
byte[] bytes = new byte[fs.Length];
fs.Read(bytes, 0, Convert.ToInt32(fs.Length));
fs.Close();
return bytes;
}
finally
{
fs.Close();
}
}
几个小时后我得到System.OutOfMemoryException
。我在这里做错了吗?
更新 我在这段代码中使用返回的字节:
object s = null;
System.Reflection.Assembly a = Assembly.Load(bytes);
object o = a.CreateInstance("ID_" + report.ID.ToString().Replace("-", "_"));
Type t = o.GetType();
MethodInfo mi = t.GetMethod(name);
object[] values = new object[1];
values[0] = nameValue;
s = mi.Invoke(o, values);
return s;
答案 0 :(得分:4)
通过编辑,问题显而易见:
System.Reflection.Assembly a = Assembly.Load(bytes);
这是事情:程序集不从AppDomain
卸载。有一些垃圾收集的东西,如DynamicMethod
- 但不是一个完整的集合。如果要加载程序集,唯一安全的方法是在此过程中单独AppDomain
。然后你可以在完成它时放弃AppDomain
(卸载其中的所有内容)。
实际上,无法保证现有代码即使正常工作 - Read
也无法保证读取所有数据。我有一篇关于这个问题的博客文章...
但是:如果文件很大,很可能你会慢慢地使LOH饱和,这是一个非压缩堆。我能提供的最好建议是:不要将大文件读入数组。尝试重新编写下游代码以使用Stream
API,某种“读者”API或某种解析迭代器块。
没有看到其余代码如何处理事情,很难说更多。但是,在代码上运行内存分析器以确认它确实是引起内存问题的byte[]
是个好主意。