2012-04-19 33 views
3

我的应用程序使用加载网页的TWebBrowser。问题是,在关闭包含TWebBrowser的表单后,所使用的内存不会被释放。如果我打开和关闭表单,内存会不断增加。Delphi TWebBrowser内存泄漏

看了一些关于调用SetProcessWorkingSetSize()或CoFreeUnusedLibrariesEx()来解决这个问题的帖子,但我不确定这些是否是正确的解决方案。

任何想法如何释放TWebBrowser使用的内存?

+6

我想你可能会误解你正在用来收集这些统计数据的任何内容。堆分配器非常复杂,它们持续记忆直到需要释放它为止是非常普遍的。如果系统有足够的可用内存,为什么花费时间将其返回到操作系统时,您可以免费使用它。 – 2012-04-19 09:04:38

+1

你如何关闭(并打开)表单,并且它是否被任何东西释放?来源请。 – mj2008 2012-04-19 09:57:38

+0

如果您在不加载网页的情况下打开和关闭表单,是否仍然存在内存问题? – 2012-04-19 16:45:31

回答

1

使用TWebBrowser在幕后进行了大量工作,完成了大量与Internet Explorer完全相同的工作。它对你来说是隐藏的,但它仍然存在,我们有可能无法从内存中强制删除它。检查页面加载之前和之间的内存使用情况,并测试在调用Navigate('about:blank');时会发生什么情况。还要检查你的析构函数是否被正确调用,并考虑从OnClose或OnCloseQuery调用Navigate('about:blank');。我发现这确实有助于记忆状况。

-1

要释放内存,只是初始化新的文件:

(WebBrowser.Document as IPersistStreamInit).InitNew; 
+0

该解决方案无效,内存不断增加。 – delphirules 2015-02-05 23:16:21

-1
procedure TForm1.FreeMemory; 
begin 
    if Win32Platform = VER_PLATFORM_WIN32_NT then 
    SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF); 
end; 

,并从时间调用它来时间

FreeMemory; 
+0

此解决方案不起作用;它只是“压缩”使用的内存,但在重新定位之前使用的所有巨大内存之后重新导航。 – delphirules 2015-02-05 21:13:49

3

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

+0

使用'browser.DefaultInterface.Document'而不是'browser.Document'解决了我的内存泄漏问题。谢谢 – chadkops 2016-09-19 14:45:27