Lossen Bytearrays via Actionscript 3

stemmen
72

Hoe kan ik met kracht een lossen ByteArrayuit het geheugen met behulp van ActionScript 3?

Ik heb het volgende geprobeerd:

// First non-working solution
byteArray.length = 0;
byteArray = new ByteArray();

// Second non-working solution
for ( var i:int=0; i < byteArray.length; i++ ) {
    byteArray[i] = null;
}
De vraag is gesteld op 01/08/2008 om 13:30
bron van user
In andere talen...                            


8 antwoorden

stemmen
15

Neem een ​​kijkje op dit artikel

http://www.gskinner.com/blog/archives/2006/06/as3_resource_ma.html

IANA actionscript programmeur, maar het gevoel dat ik krijg is dat, omdat de garbage collector misschien niet uitgevoerd wanneer u dat wilt.

Vandaar http://www.craftymind.com/2008/04/09/kick-starting-the-garbage-collector-in-actionscript-3-with-air/

Dus ik zou proberen uit hun collectie code en kijk of het helpt

private var gcCount:int;
private function startGCCycle():void{
    gcCount = 0;
    addEventListener(Event.ENTER_FRAME, doGC);
}
private function doGC(evt:Event):void{
    flash.system.System.gc();
    if(++gcCount > 1){
        removeEventListener(Event.ENTER_FRAME, doGC);
        setTimeout(lastGC, 40);
    }
}
private function lastGC():void{
    flash.system.System.gc();
}
antwoordde op 01/08/2008 om 14:08
bron van user

stemmen
19

(Ik ben niet positief over dit, maar ...)

AS3 maakt gebruik van een niet-deterministische garbage collection. Dat betekent dat unreferenced geheugen zal worden vrijgemaakt wanneer de runtime voelt alsof het (meestal niet, tenzij er een reden is om te lopen, want het is een dure operatie uit te voeren). Dit is dezelfde benadering gebruikt door de meeste moderne garbage collector talen (zoals C # en Java ook).

Ervan uitgaande dat er geen andere verwijzingen naar het geheugen waarnaar wordt verwezen door byteArrayof de items in de array zelf, zal het geheugen worden bevrijd op een gegeven moment nadat u de scope, waar af te sluiten byteArraywordt verklaard.

U kunt dwingen een garbage collection, hoewel je eigenlijk niet kan. Als je dat doet, doe het alleen voor het testen van ... als je het doet in de productie, zult u de prestaties veel meer dan het helpen kwetsen.

Om een ​​GC forceren, probeer (ja, tweemaal):

flash.system.System.gc();
flash.system.System.gc();

U kunt hier meer lezen .

antwoordde op 01/08/2008 om 14:08
bron van user

stemmen
13

Jammer genoeg als het gaat om het geheugenbeheer in Flash / ActionScript is er niet veel je kunt doen. ActionScript is ontworpen om eenvoudig te gebruiken zijn (zodat ze niet willen dat mensen zorgen te maken over het geheugen management)

Het volgende is een tijdelijke oplossing, in plaats van het creëren van een ByteArrayvariabele proberen dit.

var byteObject:Object = new Object();

byteObject.byteArray = new ByteArray();

...

//Then when you are finished delete the variable from byteObject
delete byteObject.byteArray;

Waar byteArrayis een dynamische eigenschap van byteObject, kunt u het geheugen dat, want het was toegewezen bevrijden.

antwoordde op 01/08/2008 om 14:14
bron van user

stemmen
13

Ik denk dat je je eigen vraag beantwoord ...

System.totalMemorygeeft u de totale hoeveelheid geheugen wordt "gebruikt", niet toegewezen. Het is juist dat uw aanvraag alleen kan worden met behulp van 20MB, maar het heeft 5mb die gratis is voor toekomstige toewijzingen.

Ik weet niet zeker of de Adobe docs licht zou werpen op de manier waarop het geheugen beheert ...

antwoordde op 01/08/2008 om 15:03
bron van user

stemmen
29

Ik denk niet dat je iets te maken over te hebben. Als System.totalMemorynaar beneden gaat u kunt ontspannen. Het kan heel goed zijn de OS die niet de onlangs vrijgegeven geheugen heeft terug te winnen (in afwachting van de volgende keer Flash Player zal vragen om meer geheugen).

Probeer iets anders dat is erg veel geheugen te doen en ik ben er zeker van dat u zult merken dat de Flash Player toegewezen geheugen afnemen en zal worden gebruikt voor het andere proces plaats.

Zoals ik het heb begrepen, memory management in de moderne OS is niet intuïtief vanuit het perspectief van het kijken naar de elk proces, of zelfs de toegewezen totale bedrag toegewezen bedragen.

Toen ik mijn Mac heb gebruikt gedurende 5 minuten 95% van mijn 3 GB RAM-geheugen wordt gebruikt, en het zal zo blijven, het gaat nooit in de steek. Dat is gewoon de manier waarop het besturingssysteem omgaat met geheugen.

Zolang het niet elders nodig zelfs processen die nog stoppen moeten geheugen toegewezen (dit kan ze sneller start de volgende keer, bijvoorbeeld).

antwoordde op 14/08/2008 om 18:05
bron van user

stemmen
9

Dus, als ik laad zeggen 20MB van MySQL, in de Task Manager het RAM-geheugen voor de toepassing stijgt met ongeveer 25 MB. Toen ik de verbinding te verbreken en probeer de ByteArray beschikken, de RAM bevrijdt nooit op. Echter, als ik System.totalMemory gebruiken, toont aan flash player dat het geheugen wordt vrijgegeven, wat niet het geval is.

Is de flash player iets als Java doet en het reserveren van heap-ruimte en het niet vrijgeven totdat de app wordt afgesloten?

Nou ja en nee, zoals u heeft kunnen lezen van talloze blogposts de GC in AVM2 is optimistisch en zal zijn eigen mysterieuze manieren werken. Dus het werkt een beetje zoals Java en probeert te heap-ruimte te reserveren, maar als je het lang genoeg laten en gaan doen andere activiteiten die consumeren een aantal belangrijke geheugen zal dat eerdere ruimte vrij te maken. U kunt dit zien met behulp van de profiler 's nachts met een aantal tests uitgevoerd op de top van uw app.

antwoordde op 17/09/2008 om 11:09
bron van user

stemmen
7

Dus, als ik laad zeggen 20MB van MySQL, in de Task Manager het RAM-geheugen voor de toepassing stijgt met ongeveer 25 MB. Toen ik de verbinding te verbreken en probeer de ByteArray beschikken, de RAM bevrijdt nooit op. Echter, als ik System.totalMemory gebruiken, toont aan flash player dat het geheugen wordt vrijgegeven, wat niet het geval is.

De speler is "het vrijgeven van" het geheugen. Als u het venster minimaliseren en opnieuw moet je zien dat de memeory is nu veel dichter bij wat System.totalMemory shows.

Je zou ook geïnteresseerd in het gebruik van FlexBuilder's profilering hulpmiddelen die je kunt laten zien zijn als je echt geheugenlekken.

antwoordde op 06/10/2008 om 19:16
bron van user


Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more