Descarcarea un ByteArray folosind Actionscript 3

voturi
72

Cum pot descărca forțat - o ByteArraydin memorie utilizând ActionScript 3?

Am încercat următorii pași:

// 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;
}
Întrebat 01/08/2008 la 13:30
sursa de către utilizator
În alte limbi...                            


8 răspunsuri

voturi
29

Nu cred că ai ceva să - ți faci griji. Dacă se System.totalMemoryduce în jos , vă puteți relaxa. Poate fi foarte bine sistemul de operare pe care nu revendica memoria nou eliberat (în anticiparea data viitoare Flash Player va cere mai multă memorie).

Incearca sa faci ceva care este foarte intens memoria si eu sunt sigur că veți observa că memoria alocată Flash Player va scădea și folosi un alt proces în loc.

Așa cum am înțeles, managementul de memorie in moderne sisteme de operare nu este intuitiv, din perspectiva de a privi la sumele alocate fiecărui proces, sau chiar suma totală alocată.

Când l-am folosit Mac-ul meu timp de 5 minute 95% din meu 3 GB RAM este folosit, și va rămâne așa, niciodată nu merge în jos. Asta e doar modul în care sistemul de operare se ocupă de memorie.

Atâta timp cât nu este nevoie în altă parte chiar și procese care au abandonat încă mai au memorie atribuite lor (acest lucru se poate face să lanseze mai repede data viitoare, de exemplu).

Publicat 14/08/2008 la 18:05
sursa de către utilizator

voturi
19

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

AS3 folosește o colecție de gunoi non-determinist. Ceea ce înseamnă că memoria va fi eliberat fără referință oricând runtime-ul se simte ca ea (de obicei, nu excepția cazului în care există un motiv pentru a rula, deoarece este o operație costisitoare pentru a executa). Aceasta este aceeași abordare folosită de cele mai multe gunoi colectate limbi moderne (cum ar fi C # și Java, de asemenea).

Presupunând că nu există alte referiri la memorie indicat de către byteArraysau a elementelor din matrice în sine, memoria va fi eliberată la un moment dat , după ce ieșiți din domeniul de aplicare în cazul în care byteArrayeste declarat.

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

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

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

Puteți citi mai multe aici .

Publicat 01/08/2008 la 14:08
sursa de către utilizator

voturi
15

Atunci o privire la acest articol

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

IANA ActionScript programator, cu toate acestea sentimentul că sunt obtinerea este că, deoarece colectorul de gunoi nu s-ar putea rula atunci când doriți să-l.

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

Așa că aș recomanda încerca codul lor de colectare și de a vedea dacă acesta 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();
}
Publicat 01/08/2008 la 14:08
sursa de către utilizator

voturi
13

Cred că ați răspuns la întrebare ...

System.totalMemoryvă oferă cantitatea totală de memorie fiind „folosit“, nu sunt alocate. Este precis că cererea dumneavoastră poate fi doar folosind 20MB, dar are 5 MB, care este gratuit pentru viitoarele alocări.

Nu sunt sigur dacă docs Adobe ar pune în lumină modul în care acesta gestionează memoria ...

Publicat 01/08/2008 la 15:03
sursa de către utilizator

voturi
13

Din păcate , atunci când vine vorba de gestionarea memoriei în Flash / ActionScript nu există un întreg lot poți să faci. ActionScript a fost proiectat pentru a fi ușor de utilizat (asa ca nu au vrut ca oamenii să aibă să vă faceți griji cu privire la managementul memoriei)

Ceea ce urmează este o soluție alternativă, în loc de a crea o ByteArrayvariabilă î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;

În cazul în care byteArrayeste o proprietate dinamică byteObject, puteți elibera memoria care a fost alocată pentru ea.

Publicat 01/08/2008 la 14:14
sursa de către utilizator

voturi
9

Deci, dacă încărcați spun 20MB de la MySQL, in Task Manager RAM pentru aplicația merge în sus cu aproximativ 25 MB. Atunci când închid conexiunea și să încerce să dispună ByteArray, RAM nu eliberează. Cu toate acestea, dacă am folosi System.totalMemory, flash player arată că memoria este eliberată, ceea ce nu este cazul.

Este flash player-ul face ceva de genul Java și rezervarea spațiu grămadă și nu-l eliberează până când aplicația se închide?

Ei bine, da și nu, așa cum s-ar putea fi citit de nenumărate blogposts GC în AVM2 este optimist și va lucra propriile căi misterioase că e. Deci, funcționează un pic ca Java și încearcă să rezerve spațiu morman, cu toate acestea, dacă ai lăsat suficient de mult și începe să faci alte operații, care sunt consumatoare de memorie unele semnificative va elibera acel spațiu precedent. Puteti vedea acest lucru folosind Profiler peste noapte, cu unele teste care rulează pe partea de sus a aplicației.

Publicat 17/09/2008 la 11:09
sursa de către utilizator

voturi
7

Deci, dacă încărcați spun 20MB de la MySQL, in Task Manager RAM pentru aplicația merge în sus cu aproximativ 25 MB. Atunci când închid conexiunea și să încerce să dispună ByteArray, RAM nu eliberează. Cu toate acestea, dacă am folosi System.totalMemory, flash player arată că memoria este eliberată, ceea ce nu este cazul.

Jucătorul este „eliberarea“ memoria. Dacă minimizați fereastra și restaura ar trebui să vedeți că memeory este acum mult mai aproape de ceea ce arată System.totalMemory.

Ați putea fi, de asemenea, interesat în utilizarea instrumentelor de profilare FlexBuilder, care vă pot arăta dacă aveți într-adevăr pierderi de memorie.

Publicat 06/10/2008 la 19:16
sursa de către utilizator


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