/ Forside / Teknologi / Udvikling / Java Scripts / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java Scripts
#NavnPoint
molokyle 5410
Klaudi 2799
smorch 2439
kim 1360
Harlekin 1134
bentjuul 984
gibson 800
severino 695
Random 675
10  konsulent.. 626
Javascript og GC - scope?
Fra : Stig Johansen


Dato : 13-02-08 08:42

Hej alle.

Jeg er ikke den voldsomme 'ørn' til Javascript, mere serverside, derfor
mit ?.

Jeg er vant til at styre memory selv, kombineret med ref counting.
Så jeg kom i tanke om hvordan Javascript eller rettere scriptengine
håndterer orphan memory osv.

Det er mere et generelt spørgsmål, men vi kan tage udgangspunkt i AJAX
diskussionerne.

Hvis jeg laver følgende:
var req;
req = new XMLHttpRequest();
...... noget .....
req = new XMLHttpRequest();
..... noget .....

Med nummer to, får den første XMLHttpRequest() ud af scope, men blive memory
ryddet op 'automagisk'.

Eller har det nogen betydning (i Javascript) at gøre:
var req;
req = new XMLHttpRequest();
...... noget .....
req = null ; //--------- aktivt fortælle scriptengine 'out of scope'.
req = new XMLHttpRequest();
..... noget .....

Baggrunden for mit spørgsmål er at afdække evt. memory leak situationer i
JS.

Selvfølge er det mere eller mindre browser specifik, men er der nogle 'best
practice' ?

--
Med venlig hilsen
Stig Johansen

 
 
Christian Hansen (13-02-2008)
Kommentar
Fra : Christian Hansen


Dato : 13-02-08 09:02

Stig Johansen wrote:
> Det er mere et generelt spørgsmål, men vi kan tage udgangspunkt i AJAX
> diskussionerne.
>
> Hvis jeg laver følgende:
> var req;
> req = new XMLHttpRequest();
> ..... noget .....
> req = new XMLHttpRequest();
> .... noget .....
>
> Med nummer to, får den første XMLHttpRequest() ud af scope, men blive memory
> ryddet op 'automagisk'.

Ja. I javascript indeholder variable blot referencer til det enkelte
object. Når du laver nr. 2 XMLHttpRequest bliver det første object
utilgængeligt for javascriptet og så sørger javascriptmotorens garbage
collection for at objectet slettes fra hukommelsen. Dette sker løbende
og man skal ikke gøre noget for at få det til at virke, eller optimere det.

Der, hvor man kan komme i problemer med hensyn til memory leeks, er når
man arbejder med closures - når man opretter en closure holder man et
eller flere scopes i live, som ellers ville være samlet op af
javascripts garbage collection.


Mvh Christian

Stig Johansen (13-02-2008)
Kommentar
Fra : Stig Johansen


Dato : 13-02-08 12:25

Christian Hansen wrote:

> Stig Johansen wrote:
>> Det er mere et generelt spørgsmål, men vi kan tage udgangspunkt i AJAX
>> diskussionerne.
>>
>> Hvis jeg laver følgende:
>> var req;
>> req = new XMLHttpRequest();
>> ..... noget .....
>> req = new XMLHttpRequest();
>> .... noget .....
>>
>> Med nummer to, får den første XMLHttpRequest() ud af scope, men blive
>> memory ryddet op 'automagisk'.
>
> Ja. I javascript indeholder variable blot referencer til det enkelte
> object. Når du laver nr. 2 XMLHttpRequest bliver det første object
> utilgængeligt for javascriptet og så sørger javascriptmotorens garbage
> collection for at objectet slettes fra hukommelsen.

Ok, det lyder godt. Men er der nogen 'tidsmæssig' fordel ved at (forsøge at)
gennemtvinge GC'eren til at rydde op med 'req = null;'?
Jeg tænker mest på nogle uheldige serverside situationer med .NET's GC.
Det er sikkert ikke relevant 'clientside', men - nice to know.


> Der, hvor man kan komme i problemer med hensyn til memory leeks, er når
> man arbejder med closures - når man opretter en closure holder man et
> eller flere scopes i live, som ellers ville være samlet op af
> javascripts garbage collection.

closures? - søgte lidt på Google.

Det lyder lidt henad det 'sædvanlige' problem med circular references?

Suk - IE - tsk, tsk .....
Faldt over det her(Google):
<http://64.233.183.104/search?q=cache:_URZHKSEX6AJ:jibbering.com/faq/faq_notes/closures.html+javascript+closure&hl=en&ct=clnk&cd=1>

<citat>
The Internet Explorer Memory Leak Problem

The Internet Explorer web browser (verified on versions 4 to 6 (6 is current
at the time of writing)) has a fault in its garbage collection system that
prevents it from garbage collecting ECMAScript and some host objects if
those host objects form part of a "circular" reference.
</citat>

Tak for du brugte tid på at oplyse mig.

--
Med venlig hilsen
Stig Johansen

Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408849
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste