正如在任务管理器中看到的,即使是C#中的一个简单Notepad应用程序也会消耗兆字节的内存。在最小化应用程序时,任务管理器中的内存大小会大大降低,并在应用程序最大化时恢复。
我在某处读到,.NET进程预先为运行时分配保留了大量内存。这就是为什么.NET应用程序一开始就需要占用更多的内存。但是这个内存可以使用Win32应用程序接口调用来释放。权衡的是运行时分配变得很慢-这是真的吗?
发布于 2008-10-21 20:06:20
占用大量内存的原因是进程正在加载即时编译器和Windows Forms引擎。要减少这种情况,可以执行以下操作:
[DllImport("psapi.dll")]
static extern int EmptyWorkingSet(IntPtr hwProc);
static void MinimizeFootprint()
{
EmptyWorkingSet(Process.GetCurrentProcess().Handle);
}
这应该会尽可能多地减少内存占用。可能有一种方法可以减少为运行时内存分配预留的内存量。
发布于 2008-10-21 20:20:17
不应使用TaskManager来测量.NET应用程序的内存占用。
当.NET应用程序启动时,它向操作系统请求一块内存,然后将其分段,以成为托管堆、堆栈和大对象堆。TaskManager报告的是这个总的内存块,它可能被.NET完全使用,也可能不被完全使用。一旦.NET应用程序被分配了一个内存块,它不会释放它,直到操作系统请求它,这只会发生在操作系统确定需要更多内存资源的情况下。
如果要测量内存分配,则需要查看各种性能监视器(PerfMon)计数器。
您可以使用互操作代码来调用Win32 API来调整您的工作集大小,但是当您的应用程序下一次向OS请求内存时,工作集将重新启动,并且在OS分配和分配额外的内存以及.NET运行时对其进行“配置”时,性能将受到影响。
发布于 2008-10-21 20:06:45
任务管理器不会显示.NET应用程序的实际内存使用情况。要看到这一点,你几乎必须在应用程序上放置一个性能计数器或使用分析器。
你在任务管理器中看到的是应用程序的工作内存,其中包括一堆框架本身的开销,当你的应用程序加载时,框架本身也必须加载。
https://stackoverflow.com/questions/223283
复制相似问题