tisdag 3 april 2007

Javascript och minnesläckor

Idag satt jag och kodade i godan ro på jobbet, och hade varit mycket nöjd om det inte vore för en liten, halvt nedprioriterad rad på min uppgiftslista:
Webbapplikationen tycks gå långsammare när browsern varit igång länge. Finns det en minnesläcka på klientsidan? Undersök!
Jag ligger bra till tidsmässigt just nu i projektet så jag hade möjlighet att titta närmare på frågan. Det visade sig att minnesläckor i webbläsaren i samband med vissa Javascript/DOM-kopplingar är välkända, och diskuteras bland annat på den här bloggen, i denna CodeProject-artikel och hos Microsoft.

Ett problem tycks vara eventhanterare, och att man alltid bör "koppla bort" dem då sidan avslutas (vid window-objektets unload-event). Spontant känner jag att detta automatiskt borde hanteras av den funktionalitet som från början kopplar upp eventhanterarna, exempelvis $addHandler om man använder AJAX Library. Kanske är det redan så? Jag tror dock inte det. Jag ska gräva lite djupare i det hela, blir väl till slut kanske tvungen att implementera något i stil med denna lösning för eventhantering.

Sedan får man inte glömma bort alla andra mönster som kan framkalla de här minnesläckorna (som beskrivs mer noggrannt i ovan nämnda artiklar). Ibland, när det känns som att jag tvingas lägga tid på olika hack för att komma runt begränsningar i webbläsaren, önskar jag att hela termen "webbapplikation" aldrig uppstått...tacka vet jag hederliga hemsidor!

3 kommentarer:

  1. Låter som att du har det du gör i alla fall. För övrigt anser jag att du fixat till den här bloggen riktigt snyggt, kanske är dags för mig att sitta och pilla lite mer hemma :)
    Verkligen en jättesnygg headerbild också. För övrigt anser jag att du självklart ämnade att skriva "i grodan ro".

    SvaraRadera
  2. Jag har ju i och för sig använt ett färdigt tema, men jag gillar utseendet helt okej. Kommer dock att byta ut det inom kort mot en helt egen design. I grodan ro.

    SvaraRadera
  3. Jag satt och brottades lite med detta idag, och det slutade med att jag gjorde ett Javascriptobjekt som tar hand om uppkoppling och nedkoppling av events. Objektet håller reda på alla events som kopplats upp, vilket gör att precis rätt kan plockas bort både på window.onunload och när en UpdatePanel (ASP.NET-specifik AJAX-komponent) uppdateras.

    Måste dock hålla med om att Dean Edwards' lösning är riktigt snygg, med en global hanterare...hm. Om inte ärendet vore stängt i mitt projekt så kanske jag skulle byta, hehe.

    SvaraRadera