Memóriaszivárgás demonstrálása closure-val

 

Kommentár

Az oldal betöltésekor lefutó JavaScript kód DOM manipulációval létrehoz 50 darab DIV HTML elemet, aminek "click" eseményéhez egy anonim eseménykezelő függvényt rendel. A DIV elemeket sorra beszúrja az oldalba a BODY elem gyermekeként. Az anonim eseménykezelő függvény a "CreateDivs" függvényen belül van definiálva, ezért az eseménykezelő függvényből elérhetővé válik a külső függvény (CreateDivs) összes változója és argumentumlistája is.

Körkörös hivatkozás jön létre COM objektum és JavaScript objektum között, amivel az Internet Explorer nem tud mit kezdeni. A DOM elem és az eseménykezelő függvény által lefoglalt memória nem lesz felszabadítva, vagyis memóriaszivárgás jön létre. A körkörös hivatkozás megértésében segíthet a következő prezentáció.

screen shot
Ezt az oldalat az Internet Explorer 6-os verziójával teszteltem. Az oldalat egymás után rövid időközönként újratöltöttem. A képen a böngésző memóriafoglalásának alakulása látható (a memóriafoglalást az ingyenes Process Explorer for Windows-al monitoroztattam).

A memóriaszivárgás elkerülése nem jár sok többlet kódolással. Több kerülo megoldás is létezik a memóriaszivárgás elkerülésére. Ezek közül mutatok be néhányat ezen oldal JavaScript kódjára alkalmazva.

Megjegyzés: A memóriaszivárgás problémája elsősorban az Internet Explorer 6-os és korábbi verzióit érinti. Elofordulhat, hogy ez az oldal nem okoz memóriaszivárgást más böngészőkben.