Gyakorlati js megszabadulni memóriavesztés az IE

Praktikus JS: megszabadulni a memóriavesztés az IE

Kidolgozása webfejlesztés

A múltban a memóriavesztés nem okoz semmiféle problémát, webfejlesztők számára. Oldalak rendkívül egyszerű, és az átmenet az egyik a másikra volt az egyetlen normális módja a kiadás az összes rendelkezésre álló memóriát. Ha a szivárgás történik, akkor volt olyan csekély, hogy észrevétlen maradt.

Modern internetes alkalmazások kell kidolgozni, figyelembe véve a magasabb szintre. Az oldal lehet végezni egy óra alatt minden további nélkül átmenetek a helyszínen, míg ő maga dinamikusan, ha új információt web szolgáltatásokat. A nyelv motor vizsgálata szilárdsági komplex rendszerek bányászati ​​eseményeket, objektum-orientált JScript és zárak (lezárások), a termelő egyre erősebb és fejlettebb alkalmazások. Ha minden ugyanabban az időben, figyelembe véve néhány jellemzőt, a tudás, a jellegzetes mintázata memóriavesztés egyre nagyobb szükség van, még akkor is, ha azokat előzőleg rejtett mechanizmus eligazodást.

A nagy előnye a helyzet, hogy a memóriavesztés minták könnyen megtalálható, ha tudja, hol találja őket. A legsúlyosabb közülük, ami talán már találkozott, részletesen módszerek megszüntetése, ami valószínűleg az Ön esetében, akkor csak egy kis extra munkát. Míg néhány oldalon továbbra is „esik” miatt kisebb szivárgások, a legjelentősebb könnyen el lehet távolítani.

sablonok szivárgás

A következő részekben lesz szó a közös memóriavesztés minták és néhány példát az egyes. Egy figyelemre méltó példa egy olyan esetre szivárgás fog áramkör JScript, mint egy másik példa, a használata áramkör, hogy elfogják események. Ha ismeri a rendezvény lehallgatás, akkor könnyen megtalálja és megszüntesse sok a memóriavesztés, azonban más esetekben kapcsolódó lezárások, észrevétlen maradhat.

Térjünk a következő minták:

körhivatkozások

1. ábra Az alapvető minta körkörös hivatkozás

Ha szeretné látni, hogy a minta fog kinézni HTML, akkor is okozhat szivárgást, egy globális változó, és a DOM-objektum, az alábbiak szerint.

Megtörni ezt a mintát, akkor egy explicit hozzárendelését az ingatlan, amely „folyik», null. Így, ha bezárja a dokumentumot mondod a script motor között a DOM-elemek és a globális változó már nem a kommunikáció. Ennek eredményeként, az összes hivatkozás törlődik, és DOM-elem fog megjelenni. Ebben az esetben, ha egy webfejlesztő többet megtudni a belső kapcsolatok a tárgyak, mint a forgatókönyvet is, és osszák meg információikat vele.

Bonyolultabb határozat megállapította, probléma lehet a részvétel a regisztrációs folyamat linkeket, hogy megfelelően tájékoztassa az alkalmazást, ami ezek el lehet távolítani. Ebben az esetben, hogy bezárja a dokumentumot kell menni az összes ilyen elemeket, és távolítsa el őket a hivatkozások, azonban, ha a rossz megközelítés, nem csak nem csökkenti, sőt növeli a gyűrűs hivatkozást nem megszabadulni a megadott problémát.

2. ábra körhivatkozások zárószerkezettel

Lezárások ügyeleti funkció, így két különböző hívás két független áramkörök, amelyek mindegyike tartalmaz linkeket a paramétereket a hívás. Emiatt a külső átláthatóság nagyon egyszerű, sőt, lehetővé teszi, hogy bezárja a „flow”. A következő példa az egyik alapvető esetek szivárgás az áramkörben:

Ha arra gondolsz, hogyan lehet elhárítani ezt szivárgás, ez nem olyan könnyű csinálni, mint ez a helyzet a szokásos körkörös hivatkozás. „Zárás” lehet tekinteni, mint egy ideiglenes objektum, hogy létezik a körét a funkciót. Befejezése után a funkció, akkor elveszíti a kapcsolatot a lezárás is, így felmerül a kérdés, hogyan kell hívni a végső detachEvent. Az egyik legérdekesebb tárgyalt megközelítések a blog MSN terek, hála Scott Isaacs. Ez használ egy másik hiba, ami kapaszkodik az esemény onunload teljes böngészőablakban. Mivel azt tárgyak ugyanaz a hatálya, lehetővé válik, hogy távolítsa el a feldolgozáshoz, engedje el a lezárás és befejezni a tisztítási folyamatot. Hogy végre tisztázzák a helyzetet, mi is hozzá, hogy a példánkban a kiegészítő tulajdonság, amely megtartja a hivatkozást az áramkört, akkor a link fog megjelenni a lezárás és reset maga az ingatlan, így a következő kódot mintát.

lapozott szivárgás

Szivárog, amely függ az hozzáadásának sorrendje tartalmaz DOM-fa, mindig okozott az a tény, hogy van egy teremtés a köztes objektumokat, amelyeket azután nem távolítják el megfelelően. Ez történik abban az esetben, létrehozása dinamikus elemeket, amelyeket azután a DOM. Az alapvető minta egy ideiglenes kapcsolatot a két újonnan létrehozott elemeket együtt, ami a körét, amely meghatározza a gyermek eleme. Aztán, a felvétel a két elem fa a földre, mindketten öröklik keretében a teljes dokumentum, és van egy szivárgás az ideiglenes létesítmény (amelynek keretében már nem zárt). A következő ábra bemutatja a két módszer csatlakoztatására dinamikusan létrehozott elemek a teljes fát. Az első modellben hozzátesszük a gyermek elemek a szülők, és a végén, a kapott fa a DOM. Ez a módszer vezethet szivárgás a rossz memória, hogy az ideiglenes tárgyakat. A második esetben, adjuk hozzá elemeket közvetlenül az elsődleges fa dinamikus létrehozása csomópontok felülről az utolsó gyermek. Tekintettel arra, hogy minden új csatlakozás a hatálya alá a globális objektum, soha nem fogjuk létrehozni időbeli összefüggések. Ez a módszer sokkal jobb, mert lehetővé teszi, hogy elkerüljék az esetleges memória szivárgás.

3. ábra Szivárgás kapcsolatos hozzáadásának sorrendje DOM-elemek

Következő fogunk elemezni egy tipikus példája, amelyet általában figyelmen kívül hagyott szempont a legtöbb algoritmus kimutatására szivárgás. Mivel ez nem befolyásolja a nyilvánosan elérhető termékek és tárgyak, szivárgást okozhat, nagyon alacsony, akkor soha nem veszi észre a problémát. Ahhoz, hogy egy példát munkánk van szükségünk, hogy a dinamikusan generált elemeit mutató bármely lineáris (inline) függvény. Így minden ilyen hívás memóriavesztés fog bekövetkezni létrehozásáról szóló ideiglenes belső objektum (például egy eseménykezelő), amint azt csatolja az elkészített objektum a teljes fa. Mivel a szivárgás nagyon kicsi, meg kell futtatni száz ciklust. Tény, hogy ez csak néhány bájt. Futás a mintát, és visszatér egy üres oldal, meg lehet mérni a különbséget a memória mennyisége a két eset között. Amikor az első DOM-modell a mellékletet a gyermek csomópont a szülő, akkor a szülő - a közös fa, memória használat növeli kissé. Ez szivárgás kereszthivatkozások (cross-navigáció), és a memória nem szabadul fel, amikor újraindítja az IE-folyamatot. Ha a teszt egy példa, a második DOM-modell ugyanazt a műveletet, akkor nem változik a memória mennyisége nem követi. Így lehetséges, hogy helyes ilyen típusú szivárgás.

Azt akarom, hogy különösen felhívni a figyelmet, hogy ezen a ponton, mert azt mutatja, hogy nem minden memóriavesztés mutatható könnyen. Talán, hogy a probléma nyilvánvalóvá vált, szükséges ezer ismétléseket. És ez lehet a puszta részlet, például a sorrendben behelyezése tartalmaz DOM-fát, de az eredmény ugyanaz: a termelékenység kiesése. Ha a cél az építkezést a programot csak elterjedt módszereket és gyakorlati tanácsokat vezető fejlesztők szem előtt tartani, hogy minden baj lehet, és még a legjobb tanácsot lehet bizonyos szempontból nem megfelelő. Ebben az esetben a megoldás az, hogy a jelenlegi eljárás, vagy akár a létrehozása egy új, ami megoldja a problémákat.

Pszeudo-szivárgás

Nagyon gyakran a tényleges és az elvárt viselkedés néhány API vezethet arra, hogy véletlenül hívják memóriavesztés. Pszeudo-szivárgás, szinte mindig jelennek meg az oldalon maga dinamikus műveletek, és nagyon ritkán mikor látható kívül az oldalakat, amelyeken a memória kiosztás képest egy üres oldal. Azt gondolhatnánk, hogy előtted tipikus page-szivárgás, és elkezdik keresni az eredetét, ahol van egy memória túllépés. Mi egy script, hogy átírják a szöveget, mint egy példa az ilyen ál-szivárgást.

Ez a probléma alapja, valamint a helyzet járó az olyan elemek, a DOM-fa, hozzon létre ideiglenes objektumok vezet „eszik” memória. Átírása szöveges csomópont a szkript elemet újra és újra, akkor megfigyelhető, mint a rendelkezésre álló memória mennyisége fokozatosan csökken, mivel különböző motor belső objektumok, amelyeket csatolni kell a korábbi tartalmat. Különösen maradnak a tárgyak mögött, amelyek felelősek a hibakeresés script, mert teljes egészében az előző kódrészletet.

Ha fut a fenti kódot, és nézd a Task Manager, ami történik az átmenet során az „aktuális” oldal a neten, akkor nem lát-e szivárgás. A szkript fogyaszt memóriát csak az aktuális oldalon, és ha mozog egy új minden alkalommal használt memória felszabadul. Az egész hiba a rossz elvárás bizonyos viselkedést. Úgy tűnik, hogy a újraírása a szkript fogja eredményezni az előző darab eltűnik nyom nélkül, így csak a további ciklikus linkeket vagy áramkörök. de valójában ez nem tűnik el. Mint látható, egy ál-szivárgást. Ebben az esetben a lefoglalt memória mérete ijesztő, de emiatt teljesen jogos.

következtetés

Minden webfejlesztő egy személyes listát kódpéldákat általa ismert, akkor „folyik”, és megpróbálja megtalálni minden esetben megérdemelt egy döntést, ha azt észleli, a probléma forrását. Ez nagyon hasznos, és ez az oka annak, hogy ma az interneten viszonylag szabadon memóriavesztés. Gondolkodás problémák elosztása szempontjából minták, hanem az egyes darab kódot, akkor lehet kezdeni, hogy végre egy sokkal termelékenyebb és megalapozottabb döntéseket. Az ötlet az, hogy a tervezési szakaszban az alkalmazás akkor van egy ötletem, hogy milyen szivárgás lehetséges, és hogyan fognak jobban működnek. Használja a „védekező” taktika a fejlesztési és feltételezzük, hogy minden ciklikus alkalmazás memória kell szabadítani. Bár ez túlzás az igazi probléma, mert nagyon ritka, amikor tényleg szükség van, hogy engedje el a memóriát, de ez lesz lényeges, ha van változó és bővíthető tulajdonságai potenciális tendencia a szivárgás.

tovább