.NET EXE内存占用

dot*_*der 21 .net

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

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

Ed *_*fer 35

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

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

static void MinimizeFootprint()
{
    EmptyWorkingSet(Process.GetCurrentProcess().Handle);
}
Run Code Online (Sandbox Code Playgroud)

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

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

Sco*_*man 25

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

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

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

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