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

一些奇怪的现象

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

专用工作集:

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

共享工作集:

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

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

硬错误

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

提交

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

虚拟内存

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

时间: 2024-10-15 04:33:25

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

编程方法心得体会

编程学习心得和方法(转载,供新手参考)   即便是高级编程人员,像那些为开发软件工作的类库和组件高手,他们也不敢说自己精通每一种语言. 事实就是这样,每一种语言有着它们相似而又不同的语法,它们有着不同的关键字,发展出了各种各样的类库,它们的函数或者方法的声明定义都有不同,更多的差异不为我们所知. 每一种语言,它都有着太多的东西需要我们去理解和记忆,我们没有时间和精力做得太多. 对于初学者,我们最不应该急于求成,更不要试图一次性学习所有语言.事实上,我们可以选取某种语言学习.每一种语言都有着自己的

读《构建之法》的心得体会

读<构建之法>的心得体会 软件工程涉及的范围很广,对于即将投身IT业的学生而言,软件工程的内容又非常重要.读构建之法,尽管本书介绍了不少IT业正在使用的理论和技术,但是,这本书的主要思想并不是介绍所有的新思想和新技术,而是从这些新思想.新技术中总结出对自己在未来的工作中有用的东西. 在整本书中,印象最让我深刻的是“两个人的合作”这一章节.现代的软件产业经过几十年的发展,软件的结构随着用户需求的不断增加,软件的功能不断朝多元化与复杂化发展.不管是两个人的合作还是团队的合作,谈到合作不免提及规范这

阅读文章心得体会

阅读文章心得体会                         阅读了几篇文章,感觉大泥鳅这篇文章和我们的团队项目特别贴近,感觉有很多感想想要分享一下, 我想专门就大泥球这篇文章和我们团队项目的改进过程谈谈自己的感悟. 首先文章中说到的大泥球,其引申义在文中是指一个架构随意的.没有明显约束条件的系统,这样的 系统是因为在完成阶段由于各种原因成长失控而导致的结果,为了维护突然出现的各种问题,不断选用权 宜之计在系统整体上进行维修,打上一个接一个的补丁导致整体的无序性,重要的信息在系统的元素之间

关于Solr的使用总结的心得体会

摘要:在项目中使用Solr作为搜索引擎对大数据量创建索引,提供服务,本文是作者对Solr的使用总结的一点心得体会, 具体包括使用DataImportHandler从数据库中近实时同步数据.测试Solr创建索引的性能.以及测试Solr的搜索效率总结等. 具体搜索引擎概念.Solr搭建方法.数据库mysql使用方法,假设读者已有了基础.本文操作均是在linux上进行的. 1.      Solr 1.1  Solr从数据库中读取数据并创建索引速度(使用DataImportHandler) l 一次性

第一章 Android系统移植与驱动开发概述 心得体会

第一章 Android系统移植与驱动开发概述 心得体会 通过学习Android深度探索(卷1)HAL与驱动开发的第一章Android系统移植与驱动开发,我对android驱动开发与移植概念有了一个整体且系统的把握.在本章中我主要学到了一下的知识 1.Android的系统架构分为Linux内核.C/C++代码库.Android SDK API.应用程序四层. 其中重点讲解第一层 Linux 内核.这一层主要包括Linux的驱动程序以及内存管理.进程管理.电源管理等程序. 2. Android移植可

软工-六月心得体会

本月着实匆忙至极,一方面各学科都临近尾声.加紧冲刺,另一方面考试周近在眼前.而软工课毫不出人意外地又来了一个所谓的"加速出成品",将alpha版产品截止日定在了6月20日左右,毫不怯于自己2学分的体量,理直气壮地与各大主要学科争抢宝贵的考试复习时间,可谓壮哉.当然,这么做是有充分理论依据的:根据老师统计,很多同学暑假另有安排,只能提前时间.施加压力以求成品,于是像我这样空出暑假准备亡羊补牢的少数群体,也只有陪着组里各位被摁着头英勇无畏冲锋的老铁们亡命肝了.两周过去,在此谈谈心得体会.

第四章学习小结 串的模式匹配 解题心得体会

串的模式匹配 解题心得体会 关于串,模式匹配是其一个很重要的问题.针对这个问题,书上讲了两种模式匹配的算法,即BF算法和KMP算法,下面针对这两种算法的实现谈谈我的心得. 一.BF算法的探索 [错误代码1] #include<iostream> #include<string.h> using namespace std; typedef struct{ char ch[1000002]; int length; }SString; void Index_BF(SString S,

个人博客作业Week7(心得体会)

Alpha阶段结束了,内心可以说是五味杂陈.不是说我们的产品拿不上台面那般差劲,复杂的心绪主要来源于和别的队的比较,别的队才刚刚发布没多久访问量和注册量就破百了,并且还发起了找bug送红包的活动.可能是觉得付出了相同的努力,却没办法换回相同的效果,看来还是得审视自己的问题. 本周的个人作业是阅读关于软件开发本质和开发方法的博客/文章,结合自己在个人项目/结对编程/团队项目的经历,谈谈自己的理解或心得.借这个机会找一下我们的不足吧. 阅读材料目录:

AngularJS心得体会

AngularJS早些时候有过了解,知道这是一个JS的MVC框架,同类型的框架还有Backbone等.这次是由于项目需要,学习了两天的Angular后开始着手改之前的项目代码,这里大概说一下这一周学习Angular的心得体会吧. 首相,使用Angular最大的感受就是它的设计思路完全不同于Jquery,jquery更倾向于对Dom的操作:而使用Angular则需要你有一个全局的认识,你必须知道你想要做成什么样子才可以下手去做,所以我感觉ng对前端开发的要求比jquery要高一些.先来看看Angu