在使用IHTMLDocument(IHTMLDocument2)后,有没有一种释放内存的方法?
目前我正在使用EmptyWorkingSet函数,但我觉得这不是一个好方法。
EmptyWorkingSet(GetCurrentProcess);
即使释放TWebBrowser也没有帮助;问题似乎在于IHTMLDocument COM类没有被从内存中释放。是否有明确的方法来释放它;类似于Marshal.ReleaseComObject但适用于Delphi吗?
这可以通过比运行JavaScript少的内存丢失来重现,但仍然存在。如果您在表单顶部放置两个按钮并尝试以下代码...
uses MSHTML, SHDocVw;
type
TForm1 = class(TForm)
private
WebBrowser: TWebBrowser;
HTMLDocument: IHTMLDocument2;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
WebBrowser := TWebBrowser.Create(nil);
TWinControl(WebBrowser).Parent := Self;
WebBrowser.SetBounds(8, 39, ClientWidth-16, ClientHeight-47);
WebBrowser.Navigate('http://maps.google.com/');
HTMLDocument := WebBrowser.Document as IHTMLDocument2;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
WebBrowser.Free;
HTMLDocument := nil;
end;
您会发现每次释放WebBrowser后,内存都会减少。当我运行我的JavaSrcipt时,它甚至超过了300 kB,大约为1 MB,这可能会导致内存泄漏,如果我多次运行它的话。谢谢!
EmptyWorkingSet
实际上并没有释放任何内存,它只是将活动内存分页到磁盘。你的进程仍然拥有那些内存;访问它会将其重新分页回 RAM。你是如何测量进程的内存消耗的?你认为自己需要解决什么问题呢? - Rob KennedyHTMLDocument
赋值为nil
,然后再释放WebBrowser
。另一件(可能无关的)事情是,在Navigate
之后,WebBrowser.Document
可能还没有保存有效的IHtmlDocument2
(页面可能仍在加载中)。您应该使用像OnDocumentComplete
这样的事件。 - Ondrej KelleNavigate('about:blank')
。 - Ondrej KelleCoFreeUnusedLibrariesEx(0, 0);
可以在使用 WebBrowser 后立即释放大内存块。 - user532231