.NET EXE内存占用

时间:2008-10-21 20:01:24

标签: .net

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

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

3 个答案:

答案 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应用程序的实际内存使用情况。要看到您几乎必须在应用程序上放置性能计数器或使用分析器。

您在任务管理器中看到的是应用程序的工作内存,其中包括框架本身的大量开销,这些开销也必须在应用程序加载时加载。