Lazarus中TWebBrowser组件内存泄漏问题求助
循环打开网页导致的WebBrowser内存泄漏问题
环境信息
- 操作系统:Windows 7
- 开发工具:Lazarus V2.2.6(Pascal)
问题详情
在循环中重复打开网页时,每次迭代内存占用都会持续增加,已通过任务管理器定位到核心问题代码(注释中标注了各阶段内存状态):
BusyPanel.visible := True; // 当前内存占用7016 Kb lpBuffer := 0; InternetSetOption(nil, INTERNET_OPTION_SETTINGS_CHANGED, @lpBuffer, SizeOf(lpBuffer)); InternetSetOption(nil,INTERNET_OPTION_REFRESH, @lpBuffer, SizeOf(lpBuffer)); // 当前内存占用7652 Kb InternetSetOption(nil, INTERNET_OPTION_END_BROWSER_SESSION, nil, 0); // 结束前会话,内存增加600+ Kb ActiveXContainer1.Active:=true; WebBrowser1.ComServer.Navigate(PathToWebPage, onull,onull,onull,onull); // 当前内存占用8476 Kb While WebBrowser1.comserver.ReadyState <> ReadyState_Complete Do Begin Sleep(100); Application.ProcessMessages; // 必须保留此代码 End;
// 打开网页后内存占用为145,888 Kb
// 此代码处于循环内,内存泄漏随迭代次数增加而加剧BusyPanel.visible := False; // 打开网页后内存占用仍为145,888 Kb
// 2023年5月10日内存释放实验
// 此前内存占用为134000K
// 释放文档接口Doc := nil; // 内存占用变为133,900 Kb
// 获取网页浏览器控件接口Doc := WebBrowser1.ComServer.Document as IHTMLDocument2;
已尝试解决泄漏问题约两个月,以下是试过但无效的操作(已注释):
//WebBrowser1.comserver.Stop; //WebBrowser1.ComServer.Document._Release; // 内存占用133,000 Kb,无变化 //WebBrowser1.ComServer._Release;// 内存占用133,916 Kb,反而增加 //WebBrowser1.ComServer.free; //ActiveXContainer1.ComServer := nil; // 释放ActiveX组件 //ActiveXContainer1.Active := False; // 当前内存占用95,820 Kb //ActiveXContainer1.ComServer._Release; // 当前内存占用95,820 Kb //WebBrowser1.DestroyComponents; //WebBrowser1.free;
//WebBrowser1.ComServer.Document := nil;
即使机器配有32GB内存,经过约50次循环后仍会提示“Out Of Memory, Line 1”,此前的相关回答均未针对已定位的代码部分解决问题,恳请帮助!
内容的提问来源于stack exchange,提问作者LaurenceLockwood
相关产品推荐
相关产品推荐

