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