我有一个使用的应用程序TWebbrowser
定期导航到特定 URL 并提取一些数据。该应用程序 24x7 持续运行,并在页面中进行大量导航。
问题是TWebbrowser
有一个众所周知的内存泄漏问题,每次导航到新页面时,应用程序使用的内存都会增加。一段时间后,我的应用程序可以轻松使用超过 2GB 的 RAM。经过数百次导航后'Out of memory'
or 'Out of system resources'
抛出异常,解决该问题的唯一方法是重新启动应用程序。
奇怪的是FASTMM
从不显示这些泄漏。当我使用我的应用程序几分钟并关闭它时,没有任何报告。
多年来我一直在寻找这个问题的解决方案(事实上自 2007 年我编写应用程序的第一个版本以来)。有一些解决方法,但事实上,它们都不能解决问题。对我来说,唯一的解决方法是定期关闭和打开应用程序。
我已经测试过SetProcessWorkingSetSize
方法,但它只是暂时减少应用程序使用的内存。几秒钟后,应用程序再次使用大量内存。
我也尝试过EmbeddedWB
,但当它下降时TWebbrowser
,它也受到同样问题的困扰。
顺便说一句,我不能使用像这样的简单组件IdHTTP
,因为我需要在访问的网站中进行一些 JavaScript 操作。
有谁知道这个问题是否真的有解决方案?
QC#106829 https://web.archive.org/web/20171227133253/http://qc.embarcadero.com/wc/qcmain.aspx?d=106829描述了 TWebBrowser 内存泄漏的一种可能原因。访问Document
(以及通过实现的任何其他属性TOleControl.GetIDispatchProp
or TOleControl.GetIUnknownProp
) 会导致泄漏,因为它调用 AddRef 而没有调用 Release。作为解决方法,您可以手动调用 Release,也可以修补 VCL (see here http://marc.durdin.net/2012/07/understanding-and-correcting-interface-reference-leaks-in-delphis-vcl-olectrls-pas/),或者您可以避免有问题的属性(例如,通过使用browser.DefaultInterface.Document
代替browser.Document
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)