【发布时间】:2010-09-18 09:45:51
【问题描述】:
即使是 C# 中的简单 Notepad 应用程序也会消耗数兆字节的 RAM,如任务管理器中所示。在最小化应用程序时,任务管理器中的内存大小会显着下降,并在应用程序最大化时备份。
我在某处读到 .NET 进程提前为运行时分配预留了大量内存。这就是为什么 .NET 应用程序一开始就有更大的内存占用。但是可以使用 Win32 API 调用来释放此内存。权衡是运行时分配变慢 - 是这样吗?
【问题讨论】:
标签: .net
即使是 C# 中的简单 Notepad 应用程序也会消耗数兆字节的 RAM,如任务管理器中所示。在最小化应用程序时,任务管理器中的内存大小会显着下降,并在应用程序最大化时备份。
我在某处读到 .NET 进程提前为运行时分配预留了大量内存。这就是为什么 .NET 应用程序一开始就有更大的内存占用。但是可以使用 Win32 API 调用来释放此内存。权衡是运行时分配变慢 - 是这样吗?
【问题讨论】:
标签: .net
内存占用大的原因是 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 应用程序获得了一块内存,它不会在操作系统要求之前释放它,这只会在操作系统确定需要更多内存资源时发生。
如果要测量内存分配,则需要查看各种性能监视器 (PerfMon) 计数器。
您可以使用互操作代码调用 Win32 API 来调整您的工作集大小,但是当您的应用程序下次从操作系统请求内存时,工作集将重新启动,并且在操作系统分配和处理时会影响性能取出额外的内存,.NET 运行时“配置”它。
【讨论】:
任务管理器不显示 .NET 应用程序的实际内存使用情况。要查看您几乎必须在应用程序上放置一个性能计数器或使用分析器。
您在任务管理器中看到的是应用程序的工作内存,其中包括框架本身的大量开销,这些开销也必须在您的应用程序加载时加载。
【讨论】: