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

del*_*les 3 delphi memory-leaks delphi-2007 twebbrowser

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

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

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

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

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

我也试过EmbeddedWB,但随着它的下降TWebbrowser,它受到同样问题的困扰。

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

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

Jos*_*ley 7

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

  • @delphirules - 这不是“发送一些示例代码”类型的问题。如果你的泄漏是由 QC#106829 引起的,那么使用 `browser.DefaultInterface.Document` 而不是 `browser.Document`。如果您的泄漏是由其他原因引起的,那么确定导致泄漏的代码中的过程或表单,使用 TTimer 事件每秒调用几次(因此泄漏非常明显),然后开始删除或注释掉块程序或表单中的代码,直到您确定触发泄漏的特定语句。 (6认同)