程序使用内存,用得时间越长越大,关闭部分窗口不见内存减少?怎么调整??(200分)

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

w9011

Unregistered / Unconfirmed
GUEST, unregistred user!
我用的windows2000 可监视内存,做的楼层信息分布浏览,及综合查询窗口
为什么起始内存用了12M,每次刷新窗口,内存总是增加,
并且子窗口大开时内存增加一点,但关闭时却不见减少,
这样,不断浏览各窗口,内存不断增加,到30M 还多,怎么回事,
怎样像一般编辑软件一样,打开程序占用基本内存,打开若干文件增加内存,
关闭打开的文件,则内存自动释放?
 
你有动态分配的内存没释放??
 
你的窗体如果是浏览时动态创建的,就不要忘了关掉时释放,否则就创建重复了
form1:=tform1.create(self);
form1.showmodal;
form1.free;

如果是应用程序自动创建的,则每次调用就showmodal或show就行了
 
程序中我使用了,adoconnect adoquery
在paintbox 画楼层分布及汉字表示品牌,销售,面积,柜位等
一般的数据查询,偶然打开内存使用监视,发现该程序内存只是增长,
不会因为窗口的关闭(FrmXXXX.close)而减少
另外,部分窗口用了指针,但非指针窗口也只是增加,
这样,随着鼠标,键盘的使用,内存逐渐减少,
why 急!!!
总共就十几个窗口,就用去20M 以上内存,是不是程序有问题
 
我不是动态创建的,
朱窗口调用 FrmXXXX.showmodal;
子窗口完成查询,修改数据后(此时内存又增加了一点)
用 FrmXXXX.close;
内存不见减少 (用windows任务管理器看)
 
adoquery.close?
 
我在关闭窗口时,都关闭了
adoquery1.close;
adoquery2.close;
 
怀疑是程序的问题
 
呵呵,个人看法:
我觉得在程序运行过程考查资源占用意义不大,只要在程序中能做到:
1、动态创建的对象能够显式的释放:
如上面Brave兄所说的窗口对象,在程序中自动创建后能显式的(就是直接调用free了)
将其销毁,而不是默认由Delphi自己释放。
2、动态的打开文件或数据库表:
使用的时候再打开,不用的时候就Close掉
3、动态分配的内存最好显式的回收
方法与上面的相似,如:对变长数组的引用,如果无用后应该把数组的长度设为一个适应
的最小值。
就行了。

因为如果程序运行本身就要求那么多内存,(如用户要同时打开十多个文件编辑)那程序员
也没有办法。

考查程序退出后的内存释放才是重点!
 
.close仅仅是关闭窗口,并没有释放内存,应用.free才能释放内存。
 
呵呵,没想到刚才码字的时间几位已经讨论这么多了!再来:
>>我不是动态创建的,朱窗口调用 FrmXXXX.showmodal;
子窗口完成查询,修改数据后(此时内存又增加了一点)//呵呵打开了表!
用 FrmXXXX.close;//只是把窗体关闭,没有Free掉啊!内存当然没有释放

>>关于ADOQuery的Close
DataSet类的控件的内存释放一般是比较慢的(呵呵,多等等!)一般都是由数据
引擎自动处理(因为引擎都是随时准备再打开表,所以这个释放过程是自动优化的,
是个Cache内容与命中几率的问题)。只要调用过Close就行了!


 
程序全部关闭时,内存可以释放,
我看到 delphi32编辑器,在编译,或着执行打开工程时,内存会飞速增加,
如:由2M 到50M
但是在 Delphi32编辑器停顿状态下,执行别的任务,发现 delphi32所占内存会由最高
点下降至2M左右,
这样程序不至于运行,操作变慢
 
呵呵,只要程序全部关闭后内存可以释放就行了!
Delphi本身占用内存的问题是由于多任务系统的自动轮换机制,
如果一个任务长时间没有相关事件的响应(不是失去响应了)
系统会自动把该任务占用内存里的东西写虚拟内存中(就是硬盘上了)
把物理内存腾出来,以便能有最多的资源提供给现在正在进行的任务.
 
多人接受答案了。
 
我正陷于水深火热之中啊!我的程序运行时间越长,占用的内存也越多。不过我是用timer对adotable的一系列操作。你找到答案了吗?麻烦拯救兄弟一把。
 
后退
顶部