TWebbrowser大量内存泄漏:到目前为止还没有解决方案

时间:2013-10-24 15:34:38

标签: delphi memory-leaks delphi-2007 twebbrowser

我有一个使用TWebbrowser定期导航到特定网址并提取一些数据的应用程序。该应用程序保持24x7全天候运行并在页面中进行大量导航。

问题是TWebbrowser有一个众所周知的内存泄漏问题,每次导航到新页面时,都会增加用于应用程序的内存。一段时间后,我的应用程序可以轻松使用超过2GB的RAM。在导航了数百次之后,抛出了'Out of memory''Out of system resources'异常,解决它的唯一方法是重新启动应用程序。

奇怪的是FASTMM从未显示过这些泄漏。当我使用我的应用程序几分钟并关闭它时,没有任何报告。

我多年来一直在寻找这个问题的解决方案(事实上自2007年我编写应用程序的第一个版本以来)。有一些解决方法,但事实上,它们都没有解决问题。对我来说,唯一的解决方法就是定期关闭并打开应用程序。

我已经测试了SetProcessWorkingSetSize方法,但它只会暂时缩小应用程序使用的内存。几秒钟后,该应用程序再次使用大量内存。

我也试过EmbeddedWB,但是当它从TWebbrowser下降时,它也受到同样问题的困扰。

顺便说一句,我不能使用像IdHTTP这样的简单组件,因为我需要在访问过的网站中进行一些JavaScript操作。

有谁知道这个问题是否真的有解决方案?

1 个答案:

答案 0 :(得分:3)

QC#106829描述了使用TWebBrowser导致内存泄漏的一个可能原因。访问Document(以及通过TOleControl.GetIDispatchPropTOleControl.GetIUnknownProp实现的任何其他属性)会导致泄漏,因为它在不调用Release的情况下调用AddRef。作为解决方法,您可以手动调用Release,也可以修补VCL(see here),或者可以避免有问题的属性(例如,使用browser.DefaultInterface.Document代替browser.Document