当前位置:  开发笔记 > 编程语言 > 正文

.NET EXE内存占用

如何解决《.NETEXE内存占用》经验,为你挑选了2个好方法。

即使是C#中的简单记事本应用程序也会消耗数百万字节的RAM,如任务管理器中所示.在最小化应用程序时,任务管理器中的内存大小显着下降,并在应用程序最大化时备份.

我在某处读到.NET进程预先为运行时分配保留了大量内存.这就是.NET应用程序开始时拥有更大内存占用的原因.但是可以使用Win32 API调用释放此内存.权衡是运行时分配变慢 - 这是真的吗?



1> Ed Altorfer..:

内存占用大的原因是JIT编译器和Windows Forms引擎正在加载您的进程.要减少这种情况,您可以执行以下操作:

[DllImport("psapi.dll")]
static extern int EmptyWorkingSet(IntPtr hwProc);

static void MinimizeFootprint()
{
    EmptyWorkingSet(Process.GetCurrentProcess().Handle);
}

这应该尽可能地从您的内存占用中删除.可能有一种方法可以减少为运行时内存分配留出的内存量.


好主意,只是教育整个世界,尤其是软件评论家.这是一个实用的解决方案.或许不是.似乎最好采取(可能难以察觉)性能打击.
我想补充一点感谢...我知道工作集不是一个有效的表示,但这个数字往往会吓到管理员.这个技巧只是将我的一个应用程序从平均80 - 120兆的工作集下降到20 - 40 + 1
清空工作组是否有任何折衷.

2> Scott Dorman..:

不应使用TaskManager来测量.NET应用程序的内存占用量.

当.NET应用程序启动时,它会向操作系统询问一块内存,然后将其分段为托管堆,堆栈和大对象堆.这是TaskManager报告的总内存块,.NET可能会或可能不会完全使用它.一旦给.NET应用程序一块内存,它就不会在操作系统询问之前释放它,只有在OS确定需要更多内存资源时才会发生.

如果要测量内存分配,则需要查看各种性能监视器(PerfMon)计数器.

您可以使用互操作代码调用Win32 API来调整工作集大小,但是下次您的应用程序从操作系统请求内存时,工作集将重新启动,并且在操作系统分配和分发附加功能时会出现性能损失内存和.NET运行时"配置"它.

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有