内存使用率很高
本文关键字:使用率 内存 | 更新日期: 2023-09-27 18:00:59
我的windows应用程序有一个Form,上面只有一个RichTextBox
。在运行时,我将向其中加载一个文本文件。文本文件的大小约为18MB
。当我运行应用程序时,任务管理器中显示的初始内存大小是9 MB
。在RichTextBox
加载语句执行后不久,内存大小将变为164MB
。为什么18 MB
的文本文件正在消耗164MB
?
为了进一步研究,我在Form
上放了一个Button
,并点击它,称为处理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左右。加载此文件会导致内存不足异常。这就是为什么我发现了为什么当表单被处理时,整个内存并没有被回收。
因为RichTextBox
是众所周知的重控制。它需要创建内部结构,以便能够管理内容的自定义格式。
如果您只需要可视化文本,而不需要任何特殊格式,请考虑使用简单的多行TextBox
。
我在表单上放了一个按钮,点击后称为Dispose ofRichTextBox和GC.Collect((。但这无法回收内存至初始水平。内存使用量降至55MB
GC
不能保证收回所有东西。GC.Collect
只是向.NET环境发出的开始扫描垃圾的信号。内存的相关部分已经被回收,这是一件好事。其余部分由RichTextBox
生成的引用占据。
编辑
当然,为了正确理解应用程序的内存分布,您需要在内存分析器中执行它。
根据RTF文件的大小判断(18MB对于文本来说是很大的,即使是rich文本(,我猜它包含图片。出于向后兼容性的原因,大多数Windows应用程序中的RTF格式在保存图片时使用两种格式-原始和未压缩的WMF(Windows元文件格式(。
一些富文本控件(如DevExpress(支持关闭此功能。