[webkit-dev] memory leak fixes: your feedback helps......

Purushottam Sholapur purushottam.sholapur at gmail.com
Thu Apr 2 22:39:17 PDT 2009


Hi,

I was facing more problem with memory leak, that too when web pages have
more images.
I could find that div background images, images within div and dynamic
adding of div has some issue.
For that, I have to do  three changes  (qt embedded +webkit  4.5 on linux)
-------------------------
First :

For image objects, CachedResource reference count was not becoming zero,
even when removeChild is called.

I could find that DocLoader::requestResource() is putting url and image in
hash, which is not cleaned properly.

I have commented following two lines to solve this issue for time being.(In
DocLoader::requestResource())

           //m_docResources.set(resource->url(), resource);
           //checkCacheObjectStatus(resource);

But browsing looks Ok,  I do not see any issue.

Can anybody tell me, what feature might break for this change. What is the
right fix for this.
------------------------
Second:
    I had to call GarbageCollector explictly, because JSHTMLImageElement
objects were not getting freed in some cases.

    With g_timout_add, I am periodically calling  garbagecollector  collect
function.

    static gboolean callbackGarbageCollector(void* ptr)
   {
         if(! (JSDOMWindow::commonJSGlobalData()->heap.isBusy()))
        {
              JSLock lock(false);
              JSDOMWindow::commonJSGlobalData()->heap.collect();
        }
        return TRUE;  // infinite ...
   }

    // Call this function only once ......
   __attribute__((visibility("default"))) void startGCTimer(int msec)
   {
         g_timeout_add(msec /*milli sec */, callbackGarbageCollector, NULL);
   }

   I assume there will be performce overhead, but any other issue because of
this.

---------------------------
Third:
    I had to fix in our web page in javascript code.
    1. innerHTML has to set to null ( = '';) after use.
    2. div background images have to be set to null once they are removed.
    3. For removeChild, We have traverse through the tree and remove each
child and set background image to null.
    Here is the code...
        function DeleteChildren(node){
            if(node){
                var cnt = node.childNodes.length;
                for(var x = 0; x < cnt;  x++){
                    var childNode = node.childNodes[0];
                    if(childNode.hasChildNodes()){
                        DeleteChildren(childNode);
                    }
                    node.removeChild(childNode);
                    childNode=null;
                }
                node.style.backgroundImage = "";
                node=null;
            }
        }
        function removeElement() {
            ni = document.getElementById('myDiv');
            DeleteChildren(ni);
            ni.parentNode.removeChild(ni);
        }
---------------------------

If there is something wrong please suggest, I am still a beginner in
qt+webkit.

If people have seen such issues and have some fix, please share...

regards
Purush
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.webkit.org/pipermail/webkit-dev/attachments/20090403/fda797fe/attachment.html>


More information about the webkit-dev mailing list