.NET EXE内存占用

.NET EXE内存占用,.net,.net,即使是C#中的一个简单应用程序也会消耗兆字节的RAM,就像在任务管理器中看到的那样。在最小化应用程序时,任务管理器中的内存大小会显著减小,并在应用程序最大化时进行备份 我在某个地方读到,.NET进程预先为运行时分配预留了大量内存。这就是为什么.NET应用程序一开始会占用更大的内存。但是可以使用Win32 API调用释放此内存。一个折衷办法是运行时分配变慢-是真的吗?内存占用大的原因是JIT编译器和引擎正在与进程一起加载。要减少这种情况,可以执行以下操作: [DllImport("psapi.dl

即使是C#中的一个简单应用程序也会消耗兆字节的RAM,就像在任务管理器中看到的那样。在最小化应用程序时,任务管理器中的内存大小会显著减小,并在应用程序最大化时进行备份


我在某个地方读到,.NET进程预先为运行时分配预留了大量内存。这就是为什么.NET应用程序一开始会占用更大的内存。但是可以使用Win32 API调用释放此内存。一个折衷办法是运行时分配变慢-是真的吗?

内存占用大的原因是JIT编译器和引擎正在与进程一起加载。要减少这种情况,可以执行以下操作:

[DllImport("psapi.dll")]
static extern int EmptyWorkingSet(IntPtr hwProc);

static void MinimizeFootprint()
{
    EmptyWorkingSet(Process.GetCurrentProcess().Handle);
}

这应该尽可能地从内存占用中删除。您也可以通过某种方式减少为运行时内存分配而预留的内存量。

任务管理器不会显示.NET应用程序内存的实际使用情况。要了解这一点,您几乎必须在应用程序上放置一个性能计数器或使用探查器


您在Task Manager中看到的是应用程序的工作内存,其中包括框架本身的一系列开销,在应用程序加载时也必须加载这些开销。

TaskManager不应用于测量.NET应用程序的内存占用

当.NET应用程序启动时,它会向操作系统请求一块内存,然后将其分段成为托管堆、堆栈和大型对象堆。TaskManager报告的正是这一总内存块,它可能被.NET完全使用,也可能不被.NET完全使用。一旦.NET应用程序获得了一块内存,它将在操作系统发出请求之前不会释放它,这只会在操作系统确定需要更多内存资源时发生

如果要测量内存分配,需要查看各种性能监视器(PerfMon)计数器


您可以使用互操作代码调用Win32 API来调整您的工作集大小,但下一次应用程序从操作系统请求内存时,工作集将返回,并且在操作系统分配和分发额外内存以及.NET运行时“配置”时,性能将受到影响它。

我想补充一条关于这个的感谢信。。。我知道工作集不是一个有效的表示,但这个数字往往会吓到管理员。这个技巧只是把我的一个正在开发的应用程序从平均80-120兆的工作环境降到了20-40兆+1 DotNetCoder——折衷是,如果应用程序需要释放的任何资源,那么性能就会受到影响,这是相对可能的;有人看到你的应用程序占用了“大量的空间”和怪胎。我很高兴这对您有所帮助。:)我说:让windows处理工作集大小。强制它将所有内容写入页面文件对性能没有好处。同样的原因,您不应该强制垃圾收集。教育那些基于工作集大小认为你的应用程序占用了大量内存的人。好主意,教育全世界,尤其是软件审查人员。这是一个切实可行的解决办法。或许不是。似乎最好是对性能进行一次(可能是不可察觉的)打击。