为什么我的Winforms程序会保留这么多虚拟内存?

Tro*_*yen 8 c# memory .net-4.0

我有一个C#/ .NET 4.0应用程序,当我启动时显示两个窗口,其中包含大约十几个控件.当我运行我的程序(调试或发布无关紧要)时,在我甚至做任何事情之前,我在任务管理器/资源监视器中看到我的程序已经有超过450MB的私有内存.我意识到任务管理器不是测量内存使用率最可靠的方法,但它是我用户最明显的方法之一.

当我运行VS2010 .NET内存分配性能分析时,对于我的程序的完整运行,它报告实际分配给托管对象的大约5MB的RAM(我的程序通常也使用一些非托管对象,但它们非常小并且对于简化这项调查我已禁用它们,但没有显着效果).同样,如果我在显示主表单后从psapi.dll调用EmptyWorkingSet(),我的私有内存将降至~3.5 MB.

我已经在这里这里查看了有关内存占用的问题,但这些问题似乎与处理几十兆字节的程序有关.我的程序显示近500MB,看起来更令人担忧.

我无法想象所有这一切都来自开销; 为什么VS Profiler和任务管理器之间存在如此巨大的差异?

更新:有趣的是,如果我注释掉设置ImageLists的InitializeComponent()部分,任务管理器中的数字将保持在10MB以下.我有两套PictureBoxes和ImageLists,其中PictureBox显示四个图像中的一个,具体取决于选中单选按钮组中的哪个单选按钮.

这些代码行似乎会触发大量内存增加:

// 
// directionImageList
// 
this.directionImageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("directionImageList.ImageStream")));
this.directionImageList.TransparentColor = System.Drawing.Color.White;
this.directionImageList.Images.SetKeyName(0, "Dir1.png");
this.directionImageList.Images.SetKeyName(1, "Dir2.png");
this.directionImageList.Images.SetKeyName(2, "Dir3.png");
this.directionImageList.Images.SetKeyName(3, "Dir4.png");
// 
// modeImageList
// 
this.modeImageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("modeImageList.ImageStream")));
this.modeImageList.TransparentColor = System.Drawing.Color.White;
this.modeImageList.Images.SetKeyName(0, "Mode1.png");
this.modeImageList.Images.SetKeyName(1, "Mode2.png");
this.modeImageList.Images.SetKeyName(2, "Mode3.png");
Run Code Online (Sandbox Code Playgroud)

我正在使用ImageLists,所以我可以使用透明度.模式图像为100x100,每个占用<26KB的磁盘空间.方向图像默认为208x277,磁盘大约为75KB.我知道png是一种压缩格式,但即使在内存中未压缩,我也不会期望这七张图片有数百兆字节.

是否有一些我所知道的低效率,是否有另一种动态显示透明图片的方法?

结论: ImageList类有些东西可疑.有时它会丢失alpha通道,这导致我的程序保留了比它需要的更多内存.它也减慢了最初绘制主窗体的时间(在运行时和在设计器中).

倾倒两个ImageLists使我的程序降低到更健康的10MB RAM.感谢大家的所有建议!

The*_*der 0

png 已经具有透明度了。只需将白色设置为透明颜色并保存图像即可。然后正常使用它们。