Avatar billede 2705 Nybegynder
09. september 2010 - 11:38 Der er 2 kommentarer og
1 løsning

Memory leak i javascript (xmlhttprequest) med Safari

Hej
Jeg har de sidste par dage været ved at teste memory leak i javascript når man bruger Safari og XmlHttpRequest.
For at simulere en side der vises i et par uger har jeg lavet et script der består i at hente en xml-fil en masse gange. Jeg har så holdt øje med hukommelsesforbruget og kan se at det stiger løbende og ikke bliver garbage collected. Og for hver 10.000'ende måling kan jeg se at der går længere og længere tid.
Kører jeg det samme script i Firefox er der ingen problemer. Hvor går det galt?

Filerne jeg bruger:

index.html:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
  <head>
    <title>Javascript test</title>
    <script type="text/javascript" src="xml.js"></script>
  </head>
  <body>
    <p>
      <input type="button" onclick="startScript();" value="Start"/>
    </p>
    <p id="count">Counter: Not started!</p>
  </body>
</html>

xml.js:
var xmlDoc;

var counter = 0;

function startScript()
{
  document.getElementById('count').innerHTML = 'Counter: ' + counter++;
  xmlDoc = getDomAdapter("status.xml", verify).createDocument();
}

function verify()
{
  if (xmlDoc.readyState == 4)
  {
    delete httpreq['onreadystatechange'];    //Sletter eventlistener
    delete xmlDoc['onreadystatechange'];    //Sletter eventlistener
    xmlDoc = null;

    setTimeout("startScript()", 1);
  }
}

var httpreq;

//
// Returnerer en adapter til DOM.
//
function getDomAdapter(_filename, callback)
{
if('undefined' != typeof XMLHttpRequest)
    {
      adapter = 'SA';    //Safari
      //console.log("Safari browser");
    }

    switch (adapter) {
        case 'SA':
            return new (function() {
                this.createDocument = function() {
                    //console.log("httpreq: " + httpreq);
                    if(httpreq != null)
                    {
                        httpreq.onreadystatechange = null;
                        httpreq.abort();
                    }
                    else
                    {
                      httpreq = new XMLHttpRequest();
                    }
                    try {
                        httpreq.open("GET", _filename, true);
                        httpreq.onreadystatechange = callback;
                        httpreq.send(null);
                    }
                    catch (e) {
                        console.log(e);
                    }
                    return httpreq;
                };
                this.serialize = function(doc) {
                    return new XMLSerializer().serializeToString(doc);
                };
                this.parseXml = function(xml) {
                    var doc = new DOMParser().parseFromString(xml, "text/xml");
                    if ("parsererror" == doc.documentElement.nodeName) {
                        throw new Error('Parse error');
                    }
                    return doc;
                };
            })();
        default:
            throw new Error('Unable to select the DOM adapter');
    }
};

status.xml
<Root></Root>
Avatar billede 2705 Nybegynder
24. september 2010 - 10:51 #1
Til interesserede er det er åbenbart ikke scriptet der er noget galt med.
Det er en kendt fejl med memory leak i Safari.
Har løst det ved at genstarte browser automatisk en gang om dagen.
Avatar billede gilvader Nybegynder
05. april 2011 - 14:05 #2
Jeg har set fejlen i flere produkter der bruger Apples Webkit.

Prøv at bruge "POST" metode istedet for "GET" det virker for mig enkelte steder.
Avatar billede 2705 Nybegynder
06. april 2011 - 12:32 #3
Okay, mange tak for info!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester