码迷,mamicode.com
首页 > 其他好文 > 详细

转: 谈谈关于内存的一些心得体会

时间:2014-12-31 17:42:14      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:

 

一些奇怪的现象

 

现象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 的块)会留在内存中,而不频繁访问的页面在内存紧张时会被从工作集中移出,暂时保存在内存中的“转换列表”中,或者进一步换出到页面文件中。当应用程序再次访问某一页面时,操作系统会将它重新加回工作集中。

 
 

 专用工作集:

 

         工作集的子集,它专门描述了某个进程正在使用且无法与其他进程共享的内存数量。

 
 

共享工作集:

 

         工作集的子集,它专门描述了某个进程可与其他进程共享的内存数量。

 
 

从上面的介绍可以得出:工作集=专用工作集+共享工作集

 
 

 硬错误

 

内存错误的一种,与之对应的是软错误!硬错误/秒(分钟也可以):指处理器处理错误页的综合速率。用错误页数/秒来计算。当处理器请求一个不在其工作集(在物理内存中的空间)内的代码或数据时出现的页错误。这个计数器包括硬错误(那些需要磁盘访问的)和软错误(在物理内存的其它地方找到的错误页)。

 
 

 提交

 

就是该进程或程序当前使用的内存数。它可以大于工作集(物理内存),这时系统会生成虚拟内存来解决物理内存不足的问题;当然也可以小于物理内存,这样的话就不用虚拟内存了

 
 

 虚拟内存

 

         当内存耗尽时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。这部分用来充当内存使用的硬盘就叫做虚拟内存。因为硬盘的访问速度远远小于物理内存,因此虚拟内存设置过高将影响到程序的执行效率。

转: 谈谈关于内存的一些心得体会

标签:

原文地址:http://www.cnblogs.com/chongyou/p/4195922.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!