Avatar billede qumle Nybegynder
12. december 2006 - 14:59 Der er 7 kommentarer

memory leaks i Javascript?

Hej Eksperter

Jeg har en webapplication som har en bug som er meget svær at finde og jeg har brug for lidt hjælp.
når brugeren har brugt den samme skærm i "lang tid", så går browseren ned med en "Explorer encountered a problem and must close" fejl.

Det er ikke konsekvent at dette sker, men når det sker er det altid ved det samme serverkald (Save).
lang tid er naturligvis et vidt begreb men det er det bedste vi har kunnet få fra brugerne.

når fejlen opstår efter et vist stykke tid så mistænker jeg at det er en eller anden form for memory leak.

vi bruger store mængder af javascript i vores løsning.
jeg har prøvet at debugge vores javascript med visual studio, men der er det svært at se noget om memory forbrug.

er der nogen der:
...har nogle gode tools/metoder til memory overvågning af session/javascript?
...ved hvor meget ram en browser (IE) må bruge til data?
...har andre forslag til hvad der kan få en browser til at gå ned på denne måde?
Avatar billede olebole Juniormester
12. december 2006 - 15:06 #1
<ole>

Specielt IE har en frygtelig skidt garbage-collection, så der er rigtig mange kilder til den slags nedbrud. Som oftest er der dog tale et samspil mellem IE og dårlig kode. De fleste JS'ere har aldrig lært at programmere og derfor heller aldrig lært at skrive effektiv kode eller at rydde op efter sig ... de mangler den grundlæggende forståelse for programmerings håndværket.

Mon du nogensinde nedlægger variabler, tømmer arrays eller delete'er objekter? Hvis ikke, skal det jo gå galt i komplekse applikationer  ;o)

/mvh
</bole>
Avatar billede qumle Nybegynder
12. december 2006 - 16:07 #2
Hej Ole

Du har ret I at jeg aldrig har lært at programmere i js, men jeg anser mig selv for en ganske habil java/.Net programmør.

Du har ret i at vi ikke gør meget ud af at rydde op i objecter, men jeg har altid gået ud fra at de samme scope regler gælder som i andre sprog, dvs variabler erklæret inde i en metode bliver nedlagt når metode kaldet er udført.

Vi har nogle ganske få globale js variabler, dvs. variabler som er erklæret i direkter i en script blok
f.eks
<script>
var global = "xxx";
</script>

der er ikke gjort noget specielt for at rydde op i disse variable og det er nok en fejl.
Men bliver javascript variabler ikke clearet når HTML siden renderes igen?

ellers har jeg læst noget om at circulære referencer er roden til de fleste js memory leaks, men hvordan finder man lige frem til sådan nogle, f.eks vha et tool?

jeg læste i en artikel at mange page faults er tegn på memory leaks, vi har omkring 2-4000 page faults pr server kald på den pågældende side.
Er det mange?
Avatar billede olebole Juniormester
12. december 2006 - 16:10 #3
Det er specielt objekter, der skal delete'es i IE ... det er mest sandsynligt dér, problemet ligger - men det er ikke til at sige uden et kik i jeres koder  =)
Avatar billede olebole Juniormester
12. december 2006 - 16:13 #4
Derudover adskiller det at skrive kode, der skal afvikles i en browser sig væsentligt fra andre sprog. Der er jo her også hele DOM-sektionen, hvor der kan gemme sig rigtig mange leaks, hvis man ikke får slettet evt. 'gamle' elementer ... igen afhængigt af koden  ;o)
Avatar billede qumle Nybegynder
13. december 2006 - 10:53 #5
det er nu ikke fordi jeg ikke vil vise dig koden men det er >2000 linier javascript så det ville måske være lidt vildt at paste det ind her.
Du siger at objecter skal deletes?
er der forskel på "var x = noget" og et object
kan du give et kodeeksempel på at delete et object? sætte det til null?

Jeg er ikke sikker på jeg forstår din kommentar omkring DOM sektionen.
DOM er Document Object Model, så langt er jeg med, og den beskriver hele HTML siden med alle HTML objecter på siden, korrekt?

Hvad mener du men at slette gamle elementer?
js? Html?
Avatar billede qumle Nybegynder
13. december 2006 - 13:50 #6
når du selv nævner DOM.

jeg har lidt mistanke til at dette stykke kode kan skabe problemer.
ideen er at man alle felter af en bestemt type igennem og så tildeler eventhandlers til de felter som der skal reageres på.
dette gøre når siden loades

hvis alle disse objecter på en eller anden måde bliver hængende efter dette metodekald er udført så kan man jo godt se hvad der vil ske:)

function initializeFieldNavigation()
        {
            var allInput    = document.getElementsByTagName('input');
            var allTextarea = document.getElementsByTagName('textarea');
            var allSelect    = document.getElementsByTagName('select');
            var allButton    = document.getElementsByTagName('button');
            var allA        = document.getElementsByTagName('a');
           
            var nr = 0;
           
            for( nr = 0 ; nr < allInput.length ; nr++ )
            {
                setFieldEventHandler( allInput[nr] );
            }
           
            for( nr = 0 ; nr < allTextarea.length ; nr++ )
            {
                setFieldEventHandler( allTextarea[nr] );
            }
           
            for( nr = 0 ; nr < allSelect.length ; nr++ )
            {
                setFieldEventHandler( allSelect[nr] );
            }
           
            for( nr = 0 ; nr < allButton.length ; nr++ )
            {
                setFieldEventHandler( allButton[nr] );
            }
           
            for( nr = 0 ; nr < allA.length ; nr++ )
            {
                setFieldEventHandler( allA[nr] );
            }
        }
Avatar billede olebole Juniormester
13. december 2006 - 15:23 #7
"hvis alle disse objecter på en eller anden måde bliver hængende efter dette metodekald er udført så kan man jo godt se hvad der vil ske"

Nej, det kan jeg ikke ... hvad mener du med det, du skriver?
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