我的应用程序使用加载网页的TWebBrowser。问题是,在关闭包含TWebBrowser的表单后,所使用的内存不会被释放。如果我打开和关闭表单,内存会不断增加。Delphi TWebBrowser内存泄漏
看了一些关于调用SetProcessWorkingSetSize()或CoFreeUnusedLibrariesEx()来解决这个问题的帖子,但我不确定这些是否是正确的解决方案。
任何想法如何释放TWebBrowser使用的内存?
我的应用程序使用加载网页的TWebBrowser。问题是,在关闭包含TWebBrowser的表单后,所使用的内存不会被释放。如果我打开和关闭表单,内存会不断增加。Delphi TWebBrowser内存泄漏
看了一些关于调用SetProcessWorkingSetSize()或CoFreeUnusedLibrariesEx()来解决这个问题的帖子,但我不确定这些是否是正确的解决方案。
任何想法如何释放TWebBrowser使用的内存?
使用TWebBrowser在幕后进行了大量工作,完成了大量与Internet Explorer完全相同的工作。它对你来说是隐藏的,但它仍然存在,我们有可能无法从内存中强制删除它。检查页面加载之前和之间的内存使用情况,并测试在调用Navigate('about:blank');
时会发生什么情况。还要检查你的析构函数是否被正确调用,并考虑从OnClose或OnCloseQuery调用Navigate('about:blank');
。我发现这确实有助于记忆状况。
要释放内存,只是初始化新的文件:
(WebBrowser.Document as IPersistStreamInit).InitNew;
该解决方案无效,内存不断增加。 – delphirules 2015-02-05 23:16:21
procedure TForm1.FreeMemory;
begin
if Win32Platform = VER_PLATFORM_WIN32_NT then
SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF);
end;
,并从时间调用它来时间
FreeMemory;
此解决方案不起作用;它只是“压缩”使用的内存,但在重新定位之前使用的所有巨大内存之后重新导航。 – delphirules 2015-02-05 21:13:49
QC#106829描述了TWebBrowser内存泄漏的一个可能的原因。访问Document
(以及通过TOleControl.GetIDispatchProp
或TOleControl.GetIUnknownProp
实现的任何其他属性)会导致泄漏,因为它调用AddRef时未曾调用Release。作为解决方法,您可以手动调用Release,也可以修补VCL(see here),或者避免出现问题的属性(例如,使用browser.DefaultInterface.Document
代替browser.Document
)。
使用'browser.DefaultInterface.Document'而不是'browser.Document'解决了我的内存泄漏问题。谢谢 – chadkops 2016-09-19 14:45:27
我试着在下面的链接提供的解决方案:
虽然我可以模拟泄漏和模拟修复,应用程序会一直消耗一段时间后,大量的内存。
我想你可能会误解你正在用来收集这些统计数据的任何内容。堆分配器非常复杂,它们持续记忆直到需要释放它为止是非常普遍的。如果系统有足够的可用内存,为什么花费时间将其返回到操作系统时,您可以免费使用它。 – 2012-04-19 09:04:38
你如何关闭(并打开)表单,并且它是否被任何东西释放?来源请。 – mj2008 2012-04-19 09:57:38
如果您在不加载网页的情况下打开和关闭表单,是否仍然存在内存问题? – 2012-04-19 16:45:31