下面是我分析这问题的一些思路,希望对对这个问题感兴趣的朋友有所帮助:
Q: Is .NET Alone?
A: Nope! 前面Saucer说过了,这不是.NET的问题,所有Windows程序都有类似的行为。例如下面的C程序:
void main { while(1); } //死循环,便于我们察看Task Manager
初次运行在我的机器上Mem Usage是632K,把Console最小化以后再恢复,Mem Usage变成了36K。显然,这不是一个.NET独有的问题,而是Windows Memory Management的问题。那么和.NET的GC机制也不会有太大的关系——虽然问题的表现形式很容易让人联想到GC。
Q: How much memory does my program use?
http://www.mscto.com
A: 回答这个问题并不容易。先来看看操作系统虚拟内存管理的一些基本概念:每个Windows进程都拥有4G的地址空间,但是你的机器显然没有4G的物理内存。在多任务环境下,所有进程使用的内存总和可以超过计算机的物理内存。在特定的情况下,进程的一部分可能会从物理内存中删除而被暂存在硬盘的文件里(pagefile),当进程试图访问这些被交换到pagefile里的内存的时候,系统会产生一个缺页中断(page fault),这时候Windows内存管理器会负责把对应的内存页重新从硬盘调入物理内存。
在某个时间内,一个进程可以直接访问到的物理内存(不发生缺页中断)叫做这个进程的 Working Set ;而一个进程从4G的地址空间当中实际分配(commit)了的、可访问的内存称为 Committed Virtual Memory 。Committed VM可能存在于Page File当中,WorkingSet则一定位于物理内存。
所以要回答上面的问题先要反问一句:What're you talking about? Physical Memory or Committed Memory?
Q: What is this "Mem Usage" data? 软件开发网
A: From Task Manager Help: In Task Manager, the current Working Set of a process, in kilobytes. 软件开发网
Mem Usage这个名字多少有些误导。它只表示这个进程当前占用的物理内存,也就是WorkingSet。WorkingSet不表示进程当前“占用”的所有虚拟内存,该进程可能还有一部分数据被交换到pagefile当中。这些数据只有在被访问的时候才会被加载到物理内存。
Task Manager有另一列数据:VM Size,表示了一个进程分配的虚存(Committed Visual Memory)——实际的定义要比这个复杂一些,但这个定义对我们目前分析的问题已经足够了。以前面的C程序为例,在最小化前后的VM Size都是176K,并没有变化。
所以,结论很简单: 当一个Windows程序被最小化的时候,Windows内存管理器把该进程的WorkingSet减到最小(根据先进先出FIFO或者最近最少使用LRU),把大部分数据交换到pagefile里。 这很容易理解:我们通常总是希望为前台的应用程序留出更多物理内存,从而具有更好的性能。 当该程序从最小化恢复的时候,Windows也不会完全加载程序的所有虚存,只是加载了必要的部分。 这也很容易理解:程序启动阶段的代码通常在启动之后很少访问(对.NET程序尤其如此,向fusion这样的模块在程序正常加载之后如果没有用到Reflection通常用不到)。
Q: So, Do we want a smaller workingset, or a larger one?
A: It depends. Conventional Wisdom tells us: The smaller, the better. 但是在虚存的问题上却没这么简单。如果WorkingSet太小,程序运行过程中会产生很多缺页中断,这会严重影响程序的性能。另一方面,WorkingSet太大会浪费“宝贵的”物理内存,降低整个系统的性能。 通常情况下(除非是对性能非常敏感的应用程序,并且你对Windows的内存管理了如指掌),建议不要在程序中自己调整WorkingSet的大小,而把这个任务交给Windows内存管理器。调整的方法Saucer有提到: SetProcessWorkingSetSize ();
Q: Final Question, Does my program really occupy that much physical memory? http://www.mscto.com
A: 这个问题看上去土了点——那个数字明明白白的写在Task Manager里面。
sam1111 用vadump检查的结果显示进程WorkingSet减小的主要原因是很多DLL在从最小化恢复的时候没有被加载到物理内存。我们知道DLL的一个特点是代码共享,以NTDLL.DLL为例,整个Windows系统的几乎所有应用程序(具体地说,Win32子系统的所有程序)都需要引用NTDLL.DLL,如果每人一份,光这个文件就的占用几十兆内存。Windows地解决办法是只在物理内存中保存一份NTDLL.DLL的COPY,所有引用这个DLL的程序都把这一份COPY映射到自己的内存空间里面,共享NTDLL.DLL的代码段(每个进程的数据段仍然是独立的)。所以虽然NTDLL.DLL的大小被计算在你的程序的WorkingSet里面,但是从你的程序中去掉对这个DLL的引用并不会真的释放多少物理内存——你不用,别人还在用呢!
所以,你的程序“独占”的物理内存远没有Mem Usage所表示的那么多,需要从Mem Usage里面扣除很多Shared Code Page (vadump里面可以看到)。 http://www.mscto.com
结论?不要参考Task Manager的Mem Usage数据,那个数据的大小对程序性能没有直接影响。 用Perfomence Monitor里面与.NET相关的Counter要容易、准确的多。
分享到:
相关推荐
标题中的"mem_usage_ui-0.1.tar.gz"是一个Python库的压缩包文件,它包含了一个名为"mem_usage_ui"的版本为0.1的模块或工具。这个库主要用于内存使用情况的可视化用户界面(UI)。在Python开发中,库是预编写的功能...
在【标题】"四,MEM与我1"的描述中,计算思维被强调在计算思维课程范畴论中的关键地位,特别是在入学导引学习过程中的重要作用。通过学习这门课程,学员能够提升信息处理和输出的能力,应用计算思维解决生活和工作中...
linux_os_mem_cpu_usage.htm
总的来说,CleanMem是一款值得信赖的内存优化工具,尤其适合那些经常处理大量数据或者运行大型软件的用户。通过有效地管理内存,它可以显著提升电脑的工作效率,同时保持系统的稳定运行。无论是专业人士还是普通用户...
《CleanMem内存优化工具详解及应用》 CleanMem是一款针对计算机内存进行整理和优化的工具,旨在提升系统运行效率和响应速度。它的工作原理是通过智能地清理内存中的无用缓存和临时文件,释放被占用的内存空间,从而...
理解`/dev/mem`与`/dev/kmem`的区别,掌握如何通过`mmap()`安全地访问内存,对于进行低级系统编程和硬件开发至关重要。然而,这种能力应当谨慎使用,遵循最小权限原则,以维护系统的稳定性和安全性。
"os_mem.rar_数据存储"这个压缩包文件显然包含了关于操作系统层面内存管理的源代码,具体为os_mem.c文件。这个文件很可能是实现了一些基本的内存操作子程序,用于在系统内存中进行数据的读取和写入。 在操作系统中...
`innodb_additional_mem_pool_size` - **描述**:用于存储数据字典信息和其他内部数据结构的额外内存池大小。 - **应用场景**:在系统内存资源充足且InnoDB需要处理复杂查询的情况下,适当增加此参数值可以提升性能...
- **内存清理**:memreduct能够定期或按需扫描系统内存,找出不再使用的数据块并进行回收,从而释放被占用的内存。 - **内存压缩**:对于无法释放的内存,memreduct会采用内存压缩技术,减少物理内存的使用,同时...
三菱 Q3MEM-4MBS,Q3MEM-4MBS-SET,Q3MEM-8MBS,Q3MEM-8MBS-SET记忆卡手册QCPU(英文)pdf,三菱 Q3MEM-4MBS,Q3MEM-4MBS-SET,Q3MEM-8MBS,Q3MEM-8MBS-SET记忆卡手册QCPU(英文)
memreduct-3.4-setup 是一个软件安装程序,它的作用是帮助用户减少计算机内存的使用,从而提高计算机的性能和响应速度。它通过释放不必要的内存资源,优化内存分配和管理,以及减少内存泄漏等问题来实现这一目标。 ...
`memreduct` 通过智能算法分析和识别内存中不再使用的进程和数据块,将其释放回操作系统,以便系统能更高效地分配资源。这个过程称为“内存整理”或“内存压缩”。此外,它还能够监控内存使用情况,实时进行清理操作...
通过该算法,我们可以用更少的计算资源和时间来训练一个有效的最大熵模型,这对于需要在海量数据上部署MEM的场景尤为重要。例如,在大规模文本处理和语言模型中,快速MEM算法能显著提高模型的训练效率,使得模型更...
Go-MemDB是HashiCorp公司开源的一个内存数据库库,其设计目标是为了提供一个易于使用的、高性能的内存数据存储解决方案。由于完全在内存中运行,Go-MemDB能够快速响应读写操作,特别适合于对实时性要求高的应用场景...
《内存管理与优化:以“Mem Reduct”为例》 在计算机系统中,内存管理是一项至关重要的任务,它直接影响到系统的运行效率和响应速度。内存清理工具如“Mem Reduct”便是为此目的而设计的,它能有效地帮助用户释放和...
明华MRF-35-MEM接口函数包是专为与明华IC卡读卡器进行交互设计的一套软件开发工具,它提供了丰富的函数接口,使得开发者能够轻松地实现对停车卡、公交卡等接触式IC卡片的读写操作。这一接口函数包的出现,极大地简化...
memreduct 自动清理内存工具64位和32位通用。 轻量级实时内存管理应用程序,用于监控和清理计算机上的系统内存。 该程序使用未记录的内部系统功能(本机 API)来清除系统缓存(系统工作集、工作集、备用页面列表、...
开源项目“fjl-memsize”是一个用于计算对象图大小的工具,主要关注内存占用分析。这个项目的重点在于提供一种方法来了解程序运行时内存的使用情况,这对于优化代码、减少资源消耗以及解决内存泄漏等问题至关重要。...
在软件开发与维护过程中,我们时常会遇到各种运行时错误,其中“MEM_BAD_POINTER”就是一个常见的问题。本文将详细介绍该错误的原因、可能的表现形式以及具体的解决方法。 #### 一、MEM_BAD_POINTER 错误概述 **...
2. **内存碎片整理**:如果发现内存碎片,memreduct会尝试将分散的数据块重新组织,使其更紧凑,提高内存利用率。 3. **无效引用清理**:它会查找那些应用程序不再需要但尚未释放的内存块,安全地清除这些引用,...