我的Windows应用程序有一个只有一个RichTextBox
的表单。在运行时,我正在加载一个文本文件。文本文件大小约为18MB
。当我运行应用程序时,任务管理器中显示的初始内存大小为9 MB
。在RichTextBox
加载语句执行后不久,内存大小变为164MB
。为什么18 MB
的文字文件正在消耗164MB
?
为了进一步研究,我在Button
上点了Form
,点击了RichTextBox
和GC.Collect()
的处理。但是,这无法将记忆恢复到初始水平。内存使用率降至55MB
。
有人可以告诉我为什么我没有释放完整的内存吗?
以下是用于填充RichTextBox的代码:
using (FileStream fileStream = File.OpenRead(m_strFileName))
{
MemoryStream memStream = new MemoryStream();
memStream.SetLength(fileStream.Length);
fileStream.Read(memStream.GetBuffer(), 0, (int)fileStream.Length);
rchtxtTextFile.LoadFile(memStream, RichTextBoxStreamType.PlainText);
memStream.Dispose();
}
我的应用程序将允许用户加载一些大文件,这些文件实际上是HTML文件。用户将在RichTextBox编辑器中的HTML标记中进行一些更正。这些文件大约为140MB。加载此文件会导致内存不足异常。这就是为什么我发现为什么在处理表格时不回收整个记忆的原因。
答案 0 :(得分:2)
因为RichTextBox
被称为重控制。它需要创建内部结构才能管理内容的自定义格式。
如果您只需要显示文本而不需要任何特殊格式,请考虑使用简单的多行TextBox
。
我在表单上放了一个按钮,点击它的Dispose of RichTextBox和GC.Collect()。但这无法回收记忆 到初始水平。内存使用量降至仅55MB
GC
无法保证收回所有内容。 GC.Collect
只是.NET环境开始扫描垃圾的信号。记忆的相关部分已经被回收的事实是一件好事。其余部分由RichTextBox
生成的引用占用。
编辑
当然,要正确理解应用程序的内存分布,您需要在内存分析器中执行它。
答案 1 :(得分:0)
根据RTF文件的大小判断(18MB对于文本很多,甚至丰富的文本)我猜它包含图片。出于向后兼容性原因,大多数Windows应用程序中的RTF格式在保存图片时使用2种格式 - 原始和未压缩的WMF(Windows图元文件格式)。
某些富文本控件(如DevExpress')支持关闭此功能。