奇怪的现象(WebBrowser相关),贡献200分!(200分)

  • 主题发起人 主题发起人 Adnil
  • 开始时间 开始时间
A

Adnil

Unregistered / Unconfirmed
GUEST, unregistred user!
新建了一个工程,在Form1上面放一个WebBrowser控件,然后执行程序,在Windows任务管理
器中可以发现程序占用的内存在4~5M之间,接着如果把程序最小化话,可以发现程序占用内
存仅为700K左右,然后将程序恢复成原始大小,这时使用内存在1M左右。

有人可以解释这个现象吗? 是否可以在程序初始运行的时候自动执行最小化、恢复这两个
步骤(当然要内部执行)来保证程序使用的内存尽量低呢?

我的机器是win2000+ie6,Delphi 6.0
 
看看
http://www.delphibbs.com/delphibbs/dispq.asp?lid=605541
是系统的问题,不要考虑了!!
 
其实这是windows在这方面下了点功夫,基本上把任何的程序最小化后,都会使占
用内存减少,刚才我试了下Delphi,本来是33M的,最小化后变成了1.7M。其实程序也
会不同程度的减少。
没什么好解释的。
 
假设这是系统问题(实际上ie窗口也是这样的,试验一下就能知道),现在我的问题就是
如果通过程序来模拟这个最小化和恢复的过程,并且用户不能察觉。

我尝试了在webbrowser读取文件完成的时候来模拟,代码如下:
procedure TFormMain.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch
var URL: OleVariant);
begin
Application.Minimize;
Application.Restore;
end;
程序占用的内存明显减少,但是致命的缺点就是最小化和恢复的过程用户都用看见。

Any idea?
 
恐怕没有什么好处吧?可能是Windows将程序的占部分内存放入了磁盘缓存中,这样会导致
程序的总体运行速度变慢,磁盘读写增多。
不知你们用过内存整理软件没有,我猜可能就是在程序中大量申请内存,迫使Windows将一
些不常用的内存数据交换到磁盘中,然后再释放(不知对不对)。看起来系统内存是增多
了,但是一打开我的电脑或运行程序马上会读写磁盘,整体速度反而下降了,而且此时你
再看内存占用又会与整理前差不多。
内存使用的变化正好说明Windows内存使用的策略,Windows对它进行了优化,我们在没有
完全了解操作系统的内存管理机制的情况下不应该随便改动,否则会适得其反。I think.
 
同意远帆的见解。

但是从用户的角度来说,程序在
1.启动的时候就占用10M内存

2.程序启动的时候占用1M内存,使用的过程中逐渐增加至10M内存
感觉是不一样的,如果我作为一个用户,我会选择2的程序。

我们或许可以暂且不去理会Windows是如何管理内存的,只是从技术的角度来说,是否可能
以后台的方式隐式地执行Application.Minimize和Application.Restore?
 
1.启动的时候就占用10M内存

2.程序启动的时候占用1M内存,使用的过程中逐渐增加至10M内存
如果是WIN2000或NT用户,这根本就没有意义,因为我想大多数用户应该不会只查
物理内存的,还会查占用的虚拟内存是多少,结果你会发现1和2占用的内存是一样多的。
而且把物理内存的内容转移到虚拟内存只会减慢你程序的响应速度。
 
实事求是的测试结果:
1.未最小化前:内存使用8M左右,虚拟内存大小2M左右;
2.最小化:内存使用2M左右,虚拟内存大小2M左右;
3.恢复正常大小:内存使用2M左右,虚拟内存大小2M左右;

xianjun您能解释吗?
 
操作系统BUG,不需要讨论了
你尝试把一个500M文件从一片盘拷贝到另一片盘(两个物理磁盘)//假定你的内存有512M,
结果肯定是生不如死,内存被消耗到不停交换,连创建个窗口都非常困难,(任务管理器都难以启动)
你就会想抓个鸡蛋打BILLGATES了。

假定微软的内存分配策略为:
BACKTHREAD ->
WHILE (NOT SHUTDOWNED) DO
CHECK MEMORY
IF ENOUGH THEN
RECLAIM 512K FROM CACHE
ELSE
DONOTHING MAYBE NOP
ENDIF
SLEEP(3 SECS)
ENDWHILE

FILEREAD CACHE策略管理 ->
READ SOMETHING FROM DISK FILE
IF SEQUENCE FILEREAD THEN
NEWMEM=ALLOC PHYSICS MEMORY
COPY SOMTHING TO NEWMEM
ADD TO CACHE CHAIN OF FILE
ENDIF

这样,在拷贝文件的时候,由于要分配缓冲,当物理内存不够的时候,只能等待
内存回收的线层回收内存,而每N秒才回收512K,这样就会出现每拷贝512K都需要>N秒
大家想想,这是什么速度,此外,任何一个新的需要分配内存的程序都会和文件拷贝的
进程抢夺内存,这样N秒512K的内存抢夺导致连一个窗口的建立都非常之慢。

至于该最小化应用程序导致这么明显的内存效果,也许是一个类似的原因

IF MINISHOW THEN
cleanup memory of heap(DEFRAG)
ELSE
DO NOTHING
ENDIF
 
[blue]一定是系统有问题了。[:)][/blue]
 
看来这东西还是交给系统自己处理算了。

接受答案,散分 :)
 
Adnil, 呵呵,不好意思,没有收到邮件通知。
我这也是一样,可能是WebBrowser的问题吧?
没法搞!
 
后退
顶部