Vra

Hoe laai ek met geweld a ByteArray uit die geheue met ActionScript 3?

Ek het die volgende probeer:

// 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;
}

Geen korrekte oplossing nie

Ander wenke

Ek dink nie jy het iets om oor bekommerd te wees nie.As System.totalMemory gaan af kan jy ontspan.Dit kan heel moontlik die bedryfstelsel wees wat nie die nuut vrygestelde geheue herwin nie (in afwagting van die volgende keer wat Flash Player vir meer geheue sal vra).

Probeer om iets anders te doen wat baie geheue-intensief is en ek is seker dat jy sal sien dat die geheue wat aan Flash Player toegewys is, sal verminder en eerder vir die ander proses gebruik word.

Soos ek dit verstaan ​​het, is geheuebestuur in moderne bedryfstelsels nie intuïtief vanuit die perspektief om te kyk na die bedrae wat aan elke proses toegeken is, of selfs die totale bedrag wat toegeken is nie.

Wanneer ek my Mac vir 5 minute gebruik het, word 95% van my 3 GB RAM gebruik, en dit sal so bly, dit gaan nooit af nie.Dit is net hoe die bedryfstelsel geheue hanteer.

Solank dit nie elders nodig is nie, het selfs prosesse wat opgehou het, steeds geheue aan hulle toegewys (dit kan dit byvoorbeeld die volgende keer vinniger laat begin).

(Ek is nie positief hieroor nie, maar...)

AS3 gebruik 'n nie-deterministiese vullisversameling.Wat beteken dat onverwysde geheue vrygestel sal word wanneer die looptyd so voel (gewoonlik nie tensy daar 'n rede is om te hardloop nie, aangesien dit 'n duur bewerking is om uit te voer).Dit is dieselfde benadering wat gebruik word deur die meeste moderne vullisversamelde tale (soos C# en Java ook).

Gestel daar is geen ander verwysings na die geheue waarna verwys word nie byteArray of die items binne die skikking self, sal die geheue op 'n sekere punt vrygestel word nadat jy die omvang verlaat het waar byteArray word verklaar.

Jy kan 'n vullisversameling dwing, alhoewel jy regtig nie moet nie.As jy dit doen, doen dit net om te toets ...as jy dit in produksie doen, sal jy prestasie veel meer benadeel as om dit te help.

Om 'n GC te dwing, probeer (ja, twee keer):

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

Jy kan meer hier lees.

Kyk gerus na hierdie artikel

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

IANA actionscript programmeerder, maar die gevoel wat ek kry is dit, want die vullisverwyderaar kan dalk nie loop wanneer jy dit wil hê nie.

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

Ek sal dus aanbeveel om hul versamelingskode te probeer en te kyk of dit help

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();
}

Ek glo jy het jou eie vraag beantwoord...

System.totalMemory gee jou die totale hoeveelheid geheue wat "gebruik" word, nie toegeken nie.Dit is akkuraat dat jou toepassing dalk net 20mb gebruik, maar dit het 5mb wat gratis is vir toekomstige toekennings.

Ek is nie seker of die Adobe-dokumente lig sal werp op die manier waarop dit geheue bestuur nie ...

Ongelukkig wanneer dit kom by geheuebestuur in Flits/aksieskrif daar is nie baie wat jy kan doen nie.ActionScript is ontwerp om maklik te wees om te gebruik (so hulle wou nie hê mense hoef te bekommer oor geheuebestuur nie)

Die volgende is 'n oplossing, in plaas daarvan om 'n ByteArray veranderlike probeer dit.

var byteObject:Object = new Object();

byteObject.byteArray = new ByteArray();

...

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

Waar byteArray is 'n dinamiese eienskap van byteObject, kan jy die geheue wat daarvoor toegeken is, bevry.

Dus, as ek sê 20MB van MySQL laai, in die Taakbestuurder gaan die RAM vir die toepassing met ongeveer 25MB op.Wanneer ek dan die verbinding sluit en probeer om die ByteArray weg te gooi, maak die RAM nooit vry nie.As ek egter System.totalMemory gebruik, wys flash player dat die geheue vrygestel word, wat nie die geval is nie.

Doen die flitsspeler iets soos Java en behou hy hoopspasie en laat dit nie vry voordat die toepassing stop nie?

Wel ja en nee, soos jy dalk uit talle blogplasings gelees het, is die GC in AVM2 optimisties en sal dit op sy eie geheimsinnige maniere werk.Dit werk dus 'n bietjie soos Java en probeer om hoopspasie te reserveer, maar as jy dit lank genoeg laat en begin om ander bewerkings te doen wat beduidende geheue verbruik, sal dit daardie vorige spasie bevry.Jy kan dit oornag met die profileerder sien met sommige toetse wat bo-op jou toepassing loop.

Dus, as ek sê 20MB van MySQL laai, in die Taakbestuurder gaan die RAM vir die toepassing met ongeveer 25MB op.Wanneer ek dan die verbinding sluit en probeer om die ByteArray weg te gooi, maak die RAM nooit vry nie.As ek egter System.totalMemory gebruik, wys flash player dat die geheue vrygestel word, wat nie die geval is nie.

Die speler "los" die geheue.As jy die venster verklein en dit herstel, behoort jy te sien dat die geheue nou baie nader is aan wat System.totalMemory wys.

Jy sal dalk ook belangstel om FlexBuilder se profielinstrumente te gebruik wat jou kan wys of jy werklik geheuelekkasies het.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top