ActionScript 3: Fremtving garbage collection

I AS3 er der et par objekter der kan sluge hukommelse så hurtigt, at garbage collectoren ikke på almindelig vis kan følge med, hvilket kan medføre at applikationerne bliver så ustabile så Flash Player crasher.

Eksempelvis har jeg lige lavet en løsning med nogle store BitmapData objekter, her steg hukommelseforbruget fra 100 MB til 800 MB på få sekunder, hvorefter det faldt til 100 MB når garbage collectoren automatisk startede, for så at stige igen.

Løsningen for mig blev at fremtvinge garbage collection stort set hele tiden, og dermed forblev hukommelsesforbruget rimelig stabilt på omkring 150MB.
Ulempen ved det er at garbage collection bruger en del CPU, men i mit tilfælde var hukommelsesforbruget den store flaskehals, så det var til at leve med.

Måden man fremtvinger den på er absolut et hack, men det virker og der findes ikke nogen officielle måder at gøre det på.
Man forsøger simpelthen at oprette to localconnections til det samme objekt, og det genererer en fejl der fremtvinger garbage collection:


try {
	new LocalConnection().connect('foo');
	new LocalConnection().connect('foo');
} catch (e:*) { }

Men husk, brug det med omtanke!
Normalt kan Flash Player selv håndtere det fornuftigt, og da det er et hack er der ingen garanti for at det bliver ved med at virke.



Del:These icons link to social bookmarking sites where readers can share and discover new web pages.
  • del.icio.us
  • digg

3 kommentarer

  1. Jamal siger: (19. februar 2008 kl. 15:39 )

    It’s very important to remember that you have no control over when the garbage collector in Flash Player will deallocate your objects.

    Fedt, der er fundet en hack :P

  2. Mads Buch Stage siger: (20. februar 2008 kl. 14:47 )

    Ja, når man tænker på hvor let der er at få playeren til at crashe ved at bruge for meget hukommelse, så burde de lave en officiel metode til at fremtvinge garbage collection.

  3. Jamal siger: (20. februar 2008 kl. 15:25 )

    Jep, der er mange udvikler og specialt “spil udvikler” der kunne tænke sig fremtvinge garbage collection.

    Måske bliver det implementeret i flash player 10, håbet er bare lille hehe :)

Skriv en kommentar