请问怎样可以知道当前系统已经分配的内存总数,就像SYSMON中得出的结果一样?(50分)

  • 主题发起人 主题发起人 wyjkmsc
  • 开始时间 开始时间
W

wyjkmsc

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一程序被怀疑有内存泄漏,用MEMPROOF查了半天不了了之,于是用系统
监视器查发现程序运行的过程中“已分配的内存”一项缓慢地增加,我想在
程序中监测该值,但不知如果得到,请各位兄台指点,谢了
 
用GlobalMemoryStatus函数获取内存使用信息
  MemStatus: TMEMORYSTATUS; //定义内存结构变量
  Lbl_Memory:Tlabel;
  MemStatus.dwLength := size of(TMEMORYSTATUS);
  GlobalMemoryStatus(MemStatus); //返回内存使用信息
   Lbl_Memory.Caption := format('共有内存: %d KB 可用内存: %dKB',[MemStatus.dwAvailPhys div 1024,MemStatus.dwTotalPhys div 1024]);
  //将内存信息显示在Lbl_Memory中
 
你用Memproof时看了帮助文件吗?上面说Delphi的Project Option里要更改好几
项属性呢,如果不改,当然是跟不到的了。
 
谢谢WJIACHUN兄,但好像得出的值并不是WINDOWS已分配的内存总数...
 
SACHOW兄提醒的是.可是我照帮助文档是的做了呀.
我用MEMPROOF跟踪的结果首先是一大串关于Live Poiner的东西有3百项之多,我查
看了一下都是字体和画刷等等,况且相关内存的和远远小于"已分配内存"的增长值,然
后就是约1百多项ERROR:Memory overrun error detected.全部定位在字符串的
操作语句上,比如Form1.Caption:=s等等...
我不懂是怎么一回事,只好认为她没什么用处.
 
请求帮助
 
从现象上看你是在不断的获得资源但又不释放,使内存变成不可用,你的程序也不能
用,系统也无法收回,你应该检查你的一些动态创建的控件是否一定能释放掉,比如是否存在永远不能到达的盲点。
 
您好,Only You,这正是我要在程序中监视内存的原因
 
简单,单步运行该程序,同时看任务管理器。如果你非要自己自己监测,那请给我一
个理由,除非你想自己做一个 MemProof.
 


procedure ShowAbout;
var MS: TMemoryStatus;
begin
Application.CreateForm(TfrmAbout, frmAbout);
frmAbout.Image1.Picture.Assign(Application.Icon);
GlobalMemoryStatus(MS);
frmAbout.Label2.Caption:='V'+Ver+' for Windows95/98 (网络版)';
frmAbout.Label4.Caption:=OwnerName;
frmAbout.Label5.Caption:=Format('Windows 的可用物理内存: %s', [FormatFloat('#,###" KB"', MS.dwTotalPhys / 1024)]);
frmAbout.Label6.Caption:=Format('系统资源使用率: %d%%',[MS.dwMemoryLoad]);
frmAbout.ShowModal;
end;
 
Delphi的demo文件夹中很多这样的例子呀。。就是在例子的有“关于”窗口的
 
谢谢OOPSWARE兄,但我并不需要知道可用的物理内存,因为当我的程序运行时可用的
物理内存基本一直为0,后来我查出之所以程序运行着运行着就会像死棹一样是因为
随着程序的运行系统使用的交换文件越来越大,超初为6M左右,运行10个小时以后
就变成80M左右了,而且用SYSMON监视的”已分配内存“项也增加了74M左右,但是
程序太大了,我仔细检查了源程序没有找到罪魁祸首,因此只好自己在程序中加监
视总分配内存的值以确定是哪一步操作导致内存使用量增加,现在的问题就是该使用
什么方法才能得到”已分配内存“的总值,请大家再想想办法吧...
 
在你的程序中查Create,(find in project)
如果是你自己创建的一定别忘Free掉。

是否有将大量信息加入String, TStrings, TTreeView, TListBox的。
用完是否clear掉了

特别是在循环中,

可能的情况!

我就闹过一笑话:
在win95中,选中写好地程序(上百个pas文件),本要将其压入zip
却误按了回车,上百个Delphi3同时启动了....
 
感谢OOPSWARE兄的提醒,待我再仔细找找看看...
 
我的问题还是没有解决!
我用GetMemoryStatus函数监视了,发现我的程序在运行了10小时后它的返回值
只增中了800K,但是用SysMon监视的"已分配内存"项却增加了80兆!
我是这样用的:
系统已分配内存总数:=总物理内存数-可用物理内存数+交换文件大小-
可用的交换文件大小
也就是:
UsedMemory:=dwTotalPhys-dwAvailPhys+dwTotalPagefile-
dwAvailPagefile;
这样的用法对吗?
 
附加功能 将问题提前
 
wyjkmsc:如果还想接着讨论请定期提前自己的帖子,如果不想继续讨论请结束帖子。
 
多人接受答案了。
 
后退
顶部