TCppWebBrowser内存无法释放的问题。

weill 2009-06-20 02:52:51
在一个窗体中放入一个TCppWebBrowser,然后将它的主页设定为www.baidu.com,并打开,然后点击百度里的无需新开窗体的页面,调出任务管理器查看,会发现内存占用越来越大!


void __fastcall TForm1::Button1Click(Tobject *Sender)
WideString MainMid;
BSTR MainPage;
MainMid="http://www.baidu.com";
MainPage=MainMid.c_bstr();
CppWebBrowser1->Navigate(MainPage,NULL,NULL,NULL,NULL);
}


用free并不能收回占用的内存

CppWebBrowser1->Free();


设置为空白页:

CppWebBrowser1->Navigate(WideString("about:blank"),NULL,NULL,NULL,NULL);

同样无效。

尝试动态生成,动态释放这个情况就更明显了。
怎么解决呢?
...全文
523 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
jtain 2011-12-02
  • 打赏
  • 举报
回复
我個人的情形是在 BCB 環境下debug 時, BCB 所佔用的記憶體會越來越大。
使用 SetProcessWorkingSetSize 之後可以大幅減少記憶體的膨脹。
這時候就應該去檢查程式是否有什麼東東沒有釋放?
我猜主要應該是BCB並不是即時的釋放記憶體,才會有這個現象。
aihuaren 2011-02-10
  • 打赏
  • 举报
回复
用这个办法的确有效,但是运行久了,是否会导致系统错误?
Waiting4you 2009-06-23
  • 打赏
  • 举报
回复
你可以去网上查一下SetProcessWorkingSetSize的文章,他们说得比较透彻,说到底,就是要警惕免费的午餐:-)
weill 2009-06-23
  • 打赏
  • 举报
回复
嗯,稍稍看了一下。
个人以为,如果使用TCPPWEBBrowser或TWEBBrowser,在适当的地方使用这个函数是有效的。
此外,据一个朋友(网下的)称在Delphi下,使用Creat来动态生成和动态销毁WEBBrowser不会出现类似内存方面的问题,不知是否真的,回头我试试delphi。

PS:测试一天,10个外挂进程,20个TCPPWebBrowser,一天中有一次突发地使得机器出现怪现象,报错意思大体是无法绘制界面,机器陷入不响应态!

现在嘛,就结帐了吧。几天了,也没有人有更好的说法。
weill 2009-06-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 Waiting4you 的回复:]
不要堕入原力的黑暗面...^_^
[/Quote]

呵呵,我明白,但是,不这样,怎么办?
Waiting4you 2009-06-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 Waiting4you 的回复:]
不要堕入原力的黑暗面...^_^
[/Quote]
再次声明一下^_^
weill 2009-06-22
  • 打赏
  • 举报
回复
“但它并不能解决内在泄漏问题;而且它也没有真正减少内存占用,只是把进程所占的内存从物理内存移了出去”,不同意这个说法。

一、当不使用这个函数时,WEB的每次CppWebBrowser1->Navigate(MainPage,NULL,NULL,NULL,NULL)将吃去0.2至2M内存(视网页的内容)。你可以试着用个Timer控件,在每次网页打开后循环打开,到100次后你的程序的内存占用就一定在100M以上,根本让人受不了。
二、“只是把进程所占的内存从物理内存移了出去”的说法个人以为是错误的。本人4G内存下禁用了虚拟内存,你说从物理内存中移动,那么,它移到了哪?难不成win除了虚拟内存文件外还会有别的缓存文件?
三、除了上面的说法外,那就只存在一种可能,那就是看起来没用,实际上还是占用了。个人以为这不太可能。
TripH0101 2009-06-22
  • 打赏
  • 举报
回复
学习
Waiting4you 2009-06-22
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 weill 的回复:]
引用 5 楼 Waiting4you 的回复:
不要堕入原力的黑暗面...^_^


呵呵,我明白,但是,不这样,怎么办?
[/Quote]
意思是如果没办法,内存占用实在是太大,那么就用它,因为有效。
但它并不能解决内在泄漏问题;而且它也没有真正减少内存占用,只是把进程所占的内存从物理内存移了出去,甚至可以说是它打乱了操作系统的内存空间调度,如果你的程序运行后放着半小时不工作,系统也会自已帮你做这个工作的。
不过话说回来,偶有时也忍不住要用,毕竟看着自己的程序只占一点点内存心里还是很爽的,还可以骗骗用户(很多不负责任的软件评测文章也是直接看任务管理器里的内存占用的),呵呵。
weill 2009-06-21
  • 打赏
  • 举报
回复
在windows 2008下观察,发现“收缩”的,全是“可共享内存”。
weill 2009-06-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ccrun 的回复:]
SetProcessWorkingSetSize 虽然看起来象是把内存收缩了, 其实未必啊. 我记的有洋大牛曾经建议不要频繁使用这个API的.
[/Quote]

在这儿,内存的的确确是“收缩”了。不但“收缩”了,而且回收了!
weill 2009-06-21
  • 打赏
  • 举报
回复

/*
和和,我也认为,这也是个旁门左道,但是经过一天的测试运行,证明致少,在对付TWebBrowser或TCPPTWebBrowser内存占用越来越大的问题上,这玩的确有了非常实际的效果。

我设计的这个程序实际上是一个纯网页游戏的外挂,这个外挂的原理很简单,你不是是个纯网页的游戏吗?我就定时取网页的html代码进行分析,然后根据需要自动后台点击html页面上的按钮或链接。

观察发现,每回刷新或新打开一个html(php)页面后,程序占用内存就会增大2个M左右(那个游戏的页面里有一些图像和java吃了内存),每一回合下来,就是10M以上,开始,我以为是我的代码的问题,有什么玩意儿new出来了却没释放,但想方,反复查代码,把能释放的全释放,最后,为了能放干净,大改特改,使用动态生成、销毁TCPPTWebBrowser,还是根本没用!

Waiting4you给出的函数当时我就潜意识感觉有点儿偏门,不大象是正规方法,我猜这种内存的回收一定还不是很完全。网上流行的说法:TWebBrowser存在缺陷,应该不是空穴来风。

不过,即然连老妖都出来了,而且没给出好的方法,估计在当前,只能这样去解决了。
*/



/*
在这儿我猜测还有一种可能,因为IE嵌入了我们的win的内核,在TWebBrowser使用过程中,我们的win另行进行了内存的分配,而我们的BCB做出的程序无法对那一部分内存进行有效的控制。
而SetProcessWorkingSetSize却能通知win将那些内存给释放。
本人的这个外挂是个可以多开的玩意,在不使用SetProcessWorkingSetSize前,单个程序在运行12小时后,每个程序吃内存都在120M以上,而现在,12小时后吃内存不到50M。今天晚上再进行12小时测试试试。
能连继挂24小时目标就算达到了,呵呵。
本来想连挂2天试试的,但在挂的过程中发现了好几个问题,正边测试边改中。
*/



/*
其实是个无聊的小网页游戏,也许挂两天就不挂了。最重要的是,通过对它的练习,更好的掌握一些编程技术。
*/
fairchild811 2009-06-21
  • 打赏
  • 举报
回复
用TWebBrowser呢,用完把那些body,document之类的都release掉
ccrun.com 2009-06-21
  • 打赏
  • 举报
回复
记的这个API刚流行起来的时候,网上流传了一段极为"优秀"的优化进程占用内存的代码,就是弄一个定时器在窗体上,每秒钟调用一次SetProcessWorkingSetSize
于是后来有大牛出来批评了.
Waiting4you 2009-06-21
  • 打赏
  • 举报
回复
这个API其实是把物理内存里不频繁的内容移到硬盘上。不过也能回收已删除但系统还没来得及收回的缓存。
ccrun.com 2009-06-21
  • 打赏
  • 举报
回复
SetProcessWorkingSetSize 虽然看起来象是把内存收缩了, 其实未必啊. 我记的有洋大牛曾经建议不要频繁使用这个API的.
Waiting4you 2009-06-20
  • 打赏
  • 举报
回复
不要堕入原力的黑暗面...^_^
weill 2009-06-20
  • 打赏
  • 举报
回复
总结:
CoFreeUnusedLibraries //释放不再需要的库所占用的内存空间
SetProcessWorkingSetSize //设置操作系统实际划分给进程使用的内存容量
第一条没多大用处。
第二条,吖的真敢用,猛药,这不强X么。不过,还真有用!

TO:Waiting4you 我不得不承认,你是非常牛的牛人!
很长很长时间没有来CSDN提问了,都是来这儿直接查资料。

对于我提的这个问题,我查遍了全网,没有一个有效的回答。有人说这是VCL的毛病,有人说,这是WEBBrowser的毛病也有人说这是IE的毛病,就是没有一个解决的办法。

你的回答也许不是正途,但是的确可以解决问题,而且初步测试不会出错。别说“删除CppWebBrowser以后”了,就没删除它,直接用你给的两语句,内存立马巨降,而且程序并不死掉。稍后我把这个语句用到我实际的程序中试试,那个程序主要是用来进行网页的自动点击、输入用的(干嘛用?网页游戏的外挂,哈哈,做得玩的,顺带练练手)。

如果没有更高明,更规范的方法,分分就归Waiting4you了,如果有更高明的,分出一半分,三天内结帖!
Waiting4you 2009-06-20
  • 打赏
  • 举报
回复
可能和系统的调度有关系,不一定是内存泄漏。你试试删除CppWebBrowser以后再调用一下CoFreeUnusedLibraries()。看能不能回收一点。
如果不行就用SetProcessWorkingSetSize(GetCurrentProcess(),SIZE_T(-1),SIZE_T(-1)); 呵呵
weill 2009-06-20
  • 打赏
  • 举报
回复
和和,这和最小化有关系么?实在话说,我都把它放托盘中呢。
我还试过把TCppWebBrowser放在一个单独的窗体中,用完将窗体销除,内存还是没能收回!
加载更多回复(1)

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧