Lossing en ByteArray bruke Actionscript 3

stemmer
77

Hvordan kan jeg kraftig losse en ByteArrayfra minnet ved hjelp av Actionscript 3?

Jeg har prøvd følgende:

// 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;
}
Publisert på 01/08/2008 klokken 12:30
kilden bruker
På andre språk...                            


8 svar

stemmer
32

Jeg tror ikke du har noe å bekymre seg for. Hvis System.totalMemorygår ned kan du slappe av. Det kan meget vel være den OS som ikke gjenvinne den nylig frigjorte minne (i påvente av neste gang Flash Player vil be om mer minne).

Prøv å gjøre noe annet som er svært minnekrevende, og jeg er sikker på at du vil legge merke til at minnet allokert til Flash Player vil avta og bli brukt til andre prosesser i stedet.

Som jeg har forstått det, er minnehåndtering i moderne OS er ikke intuitive fra perspektivet til å se på de beløp avsatt til hver prosess, eller til det totale beløpet tildelt.

Når jeg har brukt min Mac i 5 minutter 95% av min 3 GB RAM er brukt, og det vil forbli slik, det går aldri ned. Det er bare måten OS håndterer minne.

Så lenge det ikke er nødvendig andre steder med prosesser som har sluttet har fortsatt minne tildelt dem (dette kan gjøre dem starte raskere neste gang, for eksempel).

Svarte 14/08/2008 kl. 17:05
kilden bruker

stemmer
23

(Jeg er ikke positivt om dette, men ...)

AS3 bruker en ikke-deterministisk sanering. Hvilket betyr at unreferenced minne vil bli frigjort når runtime føles som det (vanligvis ikke med mindre det er en grunn til å kjøre, siden det er en dyr operasjon for å utføre). Dette er den samme tilnærmingen som brukes av de fleste moderne søppel samlet språk (som C # og Java i tillegg).

Forutsatt at det er ingen andre referanser til minne peker på byteArrayeller elementene i matrisen selv, vil minnet bli frigjort på et tidspunkt når du avslutter omfang der byteArrayer deklarert.

Du kan tvinge en søppelrydding, selv om du egentlig ikke burde. Hvis du gjør det, gjør det bare for testing ... Hvis du gjør det i produksjon, vil du skade ytelsen mye mer enn hjelpe den.

Å tvinge en GC, prøve (ja, to ganger):

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

Du kan lese mer her .

Svarte 01/08/2008 kl. 13:08
kilden bruker

stemmer
18

Ta en titt på denne artikkelen

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

IANA Actionscript programmerer, men følelsen jeg får er at, fordi søppelinnsamler ikke kan kjøre når du vil ha det til.

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

Så jeg vil anbefale å prøve ut sin samling kode og se om det hjelper

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();
}
Svarte 01/08/2008 kl. 13:08
kilden bruker

stemmer
15

Jeg tror du har besvart ditt eget spørsmål ...

System.totalMemorygir deg den totale mengden minne som blir "brukt", ikke bevilget. Det er sant at søknaden kan bare være å bruke 20MB, men det har 5MB som er gratis for fremtidige bevilgninger.

Jeg er ikke sikker på om Adobe docs vil kaste lys over den måten at den klarer minne ...

Svarte 01/08/2008 kl. 14:03
kilden bruker

stemmer
15

Dessverre når det gjelder minnehåndtering i Flash / Actionscript er det ikke mye du kan gjøre. Actionscript er designet for å være enkel å bruke (slik at de ikke vil at folk skal måtte bekymre seg for minnehåndtering)

Følgende er en midlertidig løsning, i stedet for å lage en ByteArrayvariabel prøve dette.

var byteObject:Object = new Object();

byteObject.byteArray = new ByteArray();

...

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

Der byteArrayer en dynamisk eiendom byteObject, kan du frigjøre minne som ble tildelt for det.

Svarte 01/08/2008 kl. 13:14
kilden bruker

stemmer
10

Så, hvis jeg laster si 20MB fra MySQL, i Task Manager RAM for programmet går opp med ca 25 MB. Så når jeg lukke tilkoblingen og prøver å kaste den ByteArray, RAM frigjør aldri opp. Men hvis jeg bruker System.totalMemory viser flash player at minnet blir utgitt, noe som ikke er tilfelle.

Er flash player gjør noe som Java og reservere haug plass og ikke slippe den før programmet avsluttes?

Vel ja og nei, som du kanskje har lest fra utallige blogginnlegg GC i AVM2 er optimistisk og vil arbeide det egne mystiske måter. Så det virker litt som Java og prøver å reservere haug plass, men hvis du lar den lenge nok og begynne å gjøre andre operasjoner som forbruker noen betydelige minne det vil frigjøre det forrige plass. Du kan se dette ved hjelp av profiler over natten med noen tester kjører på toppen av programmet ditt.

Svarte 17/09/2008 kl. 10:09
kilden bruker

stemmer
9

Så, hvis jeg laster si 20MB fra MySQL, i Task Manager RAM for programmet går opp med ca 25 MB. Så når jeg lukke tilkoblingen og prøver å kaste den ByteArray, RAM frigjør aldri opp. Men hvis jeg bruker System.totalMemory viser flash player at minnet blir utgitt, noe som ikke er tilfelle.

Spilleren er "slippe" minnet. Hvis du minimere vinduet og gjenopprette det skal du se at memeory er nå mye nærmere det System.totalMemory viser.

Du kan også være interessert i å bruke FlexBuilder sin profilering verktøy som kan vise deg hvis du virkelig har minnelekkasjer.

Svarte 06/10/2008 kl. 18:16
kilden bruker


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