Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TWebbrowser massive memory leaks : no solution so far

I have an application that uses TWebbrowser to periodically navigate to a specific URL and extract some data. The app keeps runing 24x7 and does a lot of navigation in pages.

The problem is that TWebbrowser has a well-known memory leak problem, in which every time you navigate to a new page, the memory used for the application is increased. My app can easily use more than 2GB of RAM after some time. And after navigating hundred of times an 'Out of memory' or 'Out of system resources' exception is thrown and the only way to work around it is restarting the application.

The strange thing is FASTMM never shows these leaks. When I use my app for some minutes and close it, nothing is reported.

I've been searching for a solution for this problem for years (in fact since 2007 when I wrote the first version of my application). There are some workarounds but in fact, none of them solves the problem. For me the only workaround is really to close and open the app periodically.

I already tested the SetProcessWorkingSetSize approach, but it only shrinks the memory used by the app temporarily. After some seconds, the app uses a huge amount of memory again.

I also tried EmbeddedWB, but as it descends from TWebbrowser, it's plagued by the same issue.

By the way, I can't use a simple component like IdHTTP, because I need to do some JavaScript manipulation in the website visited.

Does anyone know if is there REALLY a solution for this problem?

like image 449
delphirules Avatar asked Mar 21 '23 22:03

delphirules


1 Answers

QC#106829 describes one possible cause of memory leaks with TWebBrowser. Accessing Document (and any other properties that are implemented via TOleControl.GetIDispatchProp or TOleControl.GetIUnknownProp) causes leaks because it calls AddRef without ever calling Release. As a workaround, you can manually call Release, or you can patch the VCL (see here), or you can avoid the problematic properties (for example, by using browser.DefaultInterface.Document instead of browser.Document).

like image 172
Josh Kelley Avatar answered Apr 13 '23 20:04

Josh Kelley