即使是C#中的简单记事本应用程序也会消耗数百万字节的RAM,如任务管理器中所示.在最小化应用程序时,任务管理器中的内存大小显着下降,并在应用程序最大化时备份.
我在某处读到.NET进程预先为运行时分配保留了大量内存.这就是.NET应用程序开始时拥有更大内存占用的原因.但是可以使用Win32 API调用释放此内存.权衡是运行时分配变慢 - 这是真的吗?
内存占用大的原因是JIT编译器和Windows Forms引擎正在加载您的进程.要减少这种情况,您可以执行以下操作:
[DllImport("psapi.dll")] static extern int EmptyWorkingSet(IntPtr hwProc); static void MinimizeFootprint() { EmptyWorkingSet(Process.GetCurrentProcess().Handle); }
这应该尽可能地从您的内存占用中删除.可能有一种方法可以减少为运行时内存分配留出的内存量.
不应使用TaskManager来测量.NET应用程序的内存占用量.
当.NET应用程序启动时,它会向操作系统询问一块内存,然后将其分段为托管堆,堆栈和大对象堆.这是TaskManager报告的总内存块,.NET可能会或可能不会完全使用它.一旦给.NET应用程序一块内存,它就不会在操作系统询问之前释放它,只有在OS确定需要更多内存资源时才会发生.
如果要测量内存分配,则需要查看各种性能监视器(PerfMon)计数器.
您可以使用互操作代码调用Win32 API来调整工作集大小,但是下次您的应用程序从操作系统请求内存时,工作集将重新启动,并且在操作系统分配和分发附加功能时会出现性能损失内存和.NET运行时"配置"它.