当前所在位置:珠峰网资料 >> 计算机 >> 计算机等级考试 >> 正文
计算机三级辅导:揭穿号称内存占用极低软件的诡计
发布时间:2010/4/5 18:09:21 来源:城市学习网 编辑:admin
  物理内存和虚拟内存
  物理内存,在应用中,自然是顾名思义,物理上,真实的插在板子上的内存是多大就是多大了.看机器配置的时候,看的就是这个物理内存.
  假如执行的程序很大或很多,就会导致物理内存消耗殆尽.为了解决这个问题,Windows中运用了虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,当内存占用完时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张.
  一个程序,不可避免地要用到虚拟内存,因为不频繁执行或者已经很久没有执行的代码,没有必要留在物理内存中,只会造成浪费;放在虚拟内存中,等执行这部分代码的时候,再调出来.
  Windows 的任务治理器可以帮助我们看到进程的虚拟内存.调出任务治理器,点击菜单“查看”-“选择列”,在出现的窗口中,钩上“虚拟内存大小”.
  点“确定”,这个时候,进程列表中已经显示各进程的虚拟内存大小,如图2:
  一个程序到底应该使用多少虚拟内存呢?不一定,但是应该以恰到好处的符合虚拟内存原本作用为最好.
  下面将揭穿表面看起来调用了大量图片、大量运行库的程序,为什么才“占用”不到 1 MB 的内存的诡计.
  原来是 SetProcessWorkingSetSize 函数
  MSDN 对该函数的表述:使用这个函数来设置应用程序最小和最大的运行空间,只会保留需要的内存.当应用程序被闲置或系统内存太低时,操作系统会自动调用这个机制来设置应用程序的内存.应用程序也可以使用 VirtualLock 来锁住一定范围的内存不被系统释放;当你加大运行空间给应用程序,你能够得到的物理内存取决于系统,这会造成其他应用程序降低性能或系统总体降低性能,这也可能导致请求物理内存的操作失败,例如:建立 进程,线程,内核池,就必须小心的使用该函数.
  也就是说,该函数不是节省内存,而是强制把进程的物理内存搬到虚拟内存中.
  另外有一些资料上说,该函数“将有可能导致缺页中断,严重影响性能”.
  函数原型:
  BOOL SetProcessWorkingSetSize;
  我们用 VB 来做这么一个简单的例子,是程序占用 300 KB 内存吧.
  建立一个标准的 VB 工程,在 Form1 中放置一个 Timer1 ,把 Interval 属性设置为 1000 .然后在代码编辑框中输入以下代码:
  Private Declare Function SetProcessWorkingSetSize Lib "kernel32" As Long
  Private Declare Function GetCurrentProcess Lib "kernel32" As Long
  Private Sub Timer1_Timer
  SetProcessWorkingSetSize GetCurrentProcess, 50000, 100000
  End Sub
  然后生成 工程1.exe,执行,调出任务治理器查看,发现内存占用才 320 KB.假如把定时器关闭,这进程的内存一般 4 MB左右.
  必须定时执行该函数,否则虚拟内存会慢慢被调出来,恢复原来的内存大小.
  假如要使一个本来需要占用大量内存的程序减低到几百 KB ,使用同样的方法即可.
广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved