微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

| 我有一个C#/。NET 4.0应用程序,启动时会显示两个带有大约十二个控件的窗口。当我运行程序时(调试或发行都没有关系),甚至在执行任何操作之前,我都在任务管理器/资源监视器中看到我的程序已经具有450MB以上的私有内存。我意识到任务管理器不是衡量内存使用情况的最可靠方法,但它是我的用户最直观的方法之一。 当我运行VS2010 .NET内存分配性能分析时,对于我的程序的完整运行,它报告实际为托管对象分配了大约5MB的RAM(我的程序通常也使用一些非托管对象,但是它们很小,并且为简化此调查,我禁用了它们,尽管效果不明显)。同样,如果在显示主窗体后从psapi.dll调用EmptyWorkingSet(),则我的私有内存将减少至〜3.5 MB。 我已经在这里和这里查看了有关内存占用的问题,但是这些问题似乎是针对显示为几十兆字节的程序。我的程序显示将近500MB,这看起来更令人担忧。 我无法想象所有这些都来自开销。为什么VS Profiler和任务管理器之间存在如此巨大的差异? 更新:有趣的是,如果我注释掉设置ImageLists的InitializeComponent()部分,则任务管理器中的数字保持在10MB以下。我有两组PictureBoxes和ImageList,其中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\");
我正在使用ImageLists,因此可以使用透明度。模式映像为100x100,每个映像占用不到26KB的磁盘空间。方向图像认为208x277,磁盘上约为75KB。我知道png是一种压缩格式,但是即使在内存中未压缩,我也不会期望这7张图片有数百兆字节。 我是否知道某些效率低下的问题,并且有其他方法可以动态地透明显示图片吗? 结论:ImageList类有点麻烦。有时它将失去alpha通道,这导致我的程序保留了比所需更多的内存。这也减慢了最初绘制主要表单的时间(包括在运行时和在设计人员中)。 转储两个ImageList可以使我的程序减少到更健康的10MB RAM。感谢大家的所有建议!     

解决方法

png \已经具有透明度。只需将白色变成透明颜色并保存图像即可。然后正常使用它们。     ,我对这个问题的经验是,我的imageList中有24位图像,而imagelist的设置中却​​有32位选项。 我已经在imagelist的属性中设置了24位,问题已经消失了。这似乎是一个应该向MS发布的错误=) 对不起我的英语不好。     ,.Net框架旨在在给定可用资源的情况下尽可能快地运行。该应用程序将继续消耗越来越多的内存,因为它仅在您专门调用垃圾回收器或其他应用程序需要其占用的资源时才放手(并且随时可用)。 最小化应用程序,您应该可以更好地了解应用程序正在使用的内存量。 如果您再次使用它,它将一直处于较低的资源状态,直到被使用并再次消耗。再次将其最小化,以查看实际上(不)再次使用了多少。它内置于.net框架内存管理系统中。     ,有人解释了内存从34 MB跃升至145 MB的几个原因:查找Windows应用程序的真实内存占用量     ,首先,您是否尝试过Debug Diag?它将分析您的进程转储,并提供一些漂亮的图形内存,这可能有助于您确定谁分配了所有这些内存。 另外,请检查以确保编译后的.exe或任何引用/加载的程序集都不很大-完全有可能〜500MB都只是加载了dll。如果(例如)大量资源已嵌入到程序集中,则可能会发生这种情况。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。