一些奇怪的现象
现象1:以旺旺为例,打开旺旺主窗口的时候,内存占用大勇50多M,点击右上角的关闭按钮隐藏旺旺到系统托盘图标以后,旺旺占用的内存迅速降低到20多M。
解释:将程序隐藏到系统托盘后,尽管程序本身可能并没有释放内存的操作,但系统会进行资源优化释放一些不必要的资源。这部分优化过程是系统主动进行的。
现象2:再次显示旺旺主窗口,内存占用明显上升但并没有达到刚刚开始启动旺旺的高度。
解释:程序在启动的时候需要动态编译并加载一些资源,有很多资源是只有启动的时候才会加载。有些程序为了节约资源,采用了一种投机取巧的方式,在程序启动完成后,先最小化程序,再还原,内存占用会明显减少。
现象3:同样的程序,在XP下运行内存占用为20多M,在WIN7 下内存占用怎么10M都不到,难道WIN7系统需要的内存很少么?
解释:其实程序在XP下和WIN7下的内存占用是差不多的,唯一的区别是在任务管理器中的显示内容不一样。细心的人可能会发现XP下内存默认显示的是工作集的大小,而在WIN7下默认显示的是专用工作集的大小,关于工作集和专用工作集的介绍可以查看本文后面的名词解释。
目前测试内存泄漏并没有发现好的办法,主要通过观察程序占用的内存有无明显的上升,一般来说上升了应该存在一定的内存泄漏,但是如果内存没有上升是否意味一定没有内存泄漏呢,答案是否定的。程序员可以通过一些手段来掩盖内存泄漏的事实。举两个简单的例子:
1,设置程序的最大工作集来调整内存占用。
2,定期将物理内存的占用转移到虚拟内存。
这样尽管物理内存并没有显著的上升,但仍然有可能存在内存泄漏。
因此在发现程序有可能存在内存泄漏的时候,不光要看物理内存的变化,同时也要关注到虚拟内存的变化。
以上是自己对内存的一些新的认识,关于内存泄漏相关的知识网上有很多,这里就不多赘述了。
一些名词解释:
PID(进程控制符):
英文全称为Process Identifier,就是各进程的身份标识,程序一运行系统就会自动分配给进程一个独一无二的PID。进程中止后PID被系统回收,可能会被继续分配给新运行的程序。
工作集:
所谓工作集是指进程已映射的物理内存部分(即这些内存块全在物理内存中,并且 CPU 可以直接访问),还有一部分不在工作集中的虚拟内存则可能在转换列表中(CPU 不能通过虚地址访问,需要 Windows 映射之后才能访问),还有一部分则在磁盘上的页面文件里。工作集在进程运行时会被 Windows 自动调整,频繁访问的页面(4KB 的块)会留在内存中,而不频繁访问的页面在内存紧张时会被从工作集中移出,暂时保存在内存中的“转换列表”中,或者进一步换出到页面文件中。当应用程序再次访问某一页面时,操作系统会将它重新加回工作集中。
专用工作集:
工作集的子集,它专门描述了某个进程正在使用且无法与其他进程共享的内存数量。
共享工作集:
工作集的子集,它专门描述了某个进程可与其他进程共享的内存数量。
从上面的介绍可以得出:工作集=专用工作集+共享工作集
硬错误
内存错误的一种,与之对应的是软错误!硬错误/秒(分钟也可以):指处理器处理错误页的综合速率。用错误页数/秒来计算。当处理器请求一个不在其工作集(在物理内存中的空间)内的代码或数据时出现的页错误。这个计数器包括硬错误(那些需要磁盘访问的)和软错误(在物理内存的其它地方找到的错误页)。
提交
就是该进程或程序当前使用的内存数。它可以大于工作集(物理内存),这时系统会生成虚拟内存来解决物理内存不足的问题;当然也可以小于物理内存,这样的话就不用虚拟内存了
虚拟内存
当内存耗尽时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。这部分用来充当内存使用的硬盘就叫做虚拟内存。因为硬盘的访问速度远远小于物理内存,因此虚拟内存设置过高将影响到程序的执行效率。