2013-10-24 140 views
0

我有一个应用程序使用TWebbrowser定期导航到特定的URL并提取一些数据。该应用程序不断运行24x7并在页面中进行大量导航。TWebbrowser海量内存泄漏:目前尚无解决方案

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

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

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

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

我也试过EmbeddedWB,但是因为它从TWebbrowser下降,所以它受到同样问题的困扰。

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

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

+2

你真的不应该使用非可视化工作的可视化组件。找到另一个解至于FastMM,它不是分配WebBrowser内部存储器的人,所以它不能跟踪它。 –

+0

有一些导致解决方案,但它取决于您的要求。例如,(1)你可以每隔一小时关闭浏览器吗? (2)必须是MSIE吗?顺便说一句:“开始赏金”的确可以公平地回答这样的问题。 – stanleyxu2005

+0

http://stackoverflow.com/q/10224801/25507 –

回答

3

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

+0

可能的重复我已经做了此修补程序,并且可以重新生成修复程序,但该组件在时间内仍然使用越来越多的内存... – delphirules

+1

@delphirules - 我最终调试了TWebBrowser内存泄漏,它有一个TTimer事件每秒多次调用泄漏代码(这样我可以很容易地看到泄漏是否发生),然后反复删除或注释掉代码块并重新运行,直到我可能导致哪些代码行触发泄漏。希望这可以帮助。 –

+0

你可以给我一些示例代码? – delphirules