我的應用程序使用加載網頁的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