Vă mulțumim pentru susținere

Descărcarea unui ByteArray utilizând Actionscript 3

Cum pot descărca forțat ByteArray din memorie folosind ActionScript 3?

Am încercat (fără succes):

byteArray.length = 0;
byteArray = new ByteArray();

Și:

for ( var i:int=0; i < byteArray.length; i++ ) {
    byteArray[i] = null;
}
0
adăugat editat

7 răspunsuri

Aruncați o privire la acest articol

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

Programator IANA actionscript, dar sentimentul pe care îl primesc este că, deoarece colectorul de gunoi ar putea să nu funcționeze atunci când vrei.

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

Aș recomanda să încercați codul de colectare și să vedeți dacă vă ajută

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();
}
0
adăugat

(Nu sunt sigur despre asta, dar ...)

AS3 utilizează o colecție de gunoi non-deterministă. Ceea ce înseamnă că memoria nereferențiată va fi eliberată ori de câte ori timpul de funcționare se simte ca acesta (de obicei, dacă nu există un motiv pentru a rula, deoarece este o operațiune costisitoare de executat). Aceasta este aceeași abordare folosită de majoritatea limbilor moderne colectate de gunoi (cum ar fi C # și Java, de asemenea).

Presupunând că nu există alte referințe la memoria indicată de byteArray sau elementele din matrice însăși, memoria va fi eliberată la un moment dat după ce ați ieșit din domeniul unde byteArray este declarată.

Poți forța o colecție de gunoi, deși nu ar trebui. Dacă o faci, fa-o doar pentru testare ... dacă o faci în producție, vei răni performanța mult mai mult decât să o ajuți.

Pentru a forța un GC, încercați (da, de două ori):

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

You can read more here.

0
adăugat

Din păcate, atunci când este vorba despre gestionarea memoriei în Flash / actionscript , nu există o mulțime de lucruri pe care o puteți face. ActionScript a fost proiectat pentru a fi ușor de folosit (deci nu dorea ca oamenii să fie nevoiți să-și facă griji în ceea ce privește gestionarea memoriei)

Următoarea este o soluție, în loc să creați o variabilă ByteArray încercați acest lucru.

var byteObject:Object = new Object();

byteObject.byteArray = new ByteArray();

...

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

Unde byteArray este o proprietate dinamică a byteObject , puteți elibera memoria care a fost alocată pentru aceasta.

0
adăugat

Cred că ți-ai răspuns la întrebarea ta ...

System.totalMemory gives you the total amount of memory being "used", not allocated. It is accurate that your application may only be using 20mb, but it has 5mb that is free for future allocations.

Nu sunt sigur dacă documentele Adobe vor arunca o lumină asupra modului în care gestionează memoria ...

0
adăugat

Nu cred că ai de ce să-ți faci griji. Dacă System.totalMemory coboară, vă puteți relaxa. S-ar putea foarte bine să fie sistemul de operare care nu recuperează memoria recent eliberată (în așteptarea data viitoare când Flash Player va cere mai multă memorie). Încearcă să faci altceva care este foarte intensiv în memorie și sunt sigur că vei observa că memoria alocată programului Flash Player va scădea și va fi folosită pentru alt proces.

După cum am înțeles, gestionarea memoriei în sistemele moderne de operare nu este intuitivă din perspectiva analizării sumelor alocate fiecărui proces sau chiar a sumei totale alocate. Când mi-am folosit Mac-ul timp de 5 minute, 95% din memoria RAM de 3 GB este utilizată și va rămâne în acest fel, nu va cădea niciodată. Acesta este modul în care sistemul de operare gestionează memoria. Atâta timp cât nu este nevoie în altă parte, chiar și procesele care au ieșit au încă o memorie care le-a fost atribuită (acest lucru le poate face să apară mai repede data viitoare, de exemplu).

0
adăugat

Deci, dacă încărc să spun 20MB de la MySQL, în Task Manager, memoria RAM pentru aplicație crește cu aproximativ 25MB. Apoi, când închid conexiunea și încerc să distrug ByteArray, RAM nu se eliberează niciodată. Cu toate acestea, dacă folosesc System.totalMemory, flash player-ul arată că memoria este eliberată, ceea ce nu este cazul.

     

Flash player-ul face ceva de genul Java și rezervă spațiul de heap și nu îl eliberează până când aplicația nu mai termină?

Ei bine, da și nu, așa cum ați fi putut citi de la nenumărate blog-uri, GC în AVM2 este optimist și va funcționa pe propriile căi misterioase. Deci, funcționează un pic ca Java și încearcă să rezerve spațiu heap, totuși dacă l-ai lăsat suficient de lung și ai început să faci alte operații care consumă o memorie semnificativă, acesta va elibera acel spațiu anterior. Puteți vedea acest lucru folosind profilul de peste noapte, cu unele teste care rulează în partea de sus a aplicației.

0
adăugat