Rozładunku ByteArray pomocą ActionScript 3

głosy
72

Jak mogę stanowczo wyładować ByteArrayz pamięci za pomocą ActionScript 3?

Próbowałem z następujących powodów:

// 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;
}
Utwórz 01/08/2008 o 13:30
źródło użytkownik
W innych językach...                            


8 odpowiedzi

głosy
29

Nie sądzę, że masz się o co martwić. Jeśli System.totalMemoryidzie w dół można odpocząć. To może być bardzo dobrze, że system operacyjny nie odzyskać niedawno zwolniona pamięć (w oczekiwaniu na następny raz Flash Player będzie zapytać o więcej pamięci).

Spróbuj zrobić coś innego, że pamięć jest bardzo intensywny i jestem pewien, że można zauważyć, że pamięć przydzielona do Flash spadnie i będą używane dla innego procesu zamiast.

Jak mam rozumieć to, zarządzanie pamięcią w nowoczesnych systemów operacyjnych nie jest intuicyjny z perspektywy patrząc kwot przydzielonych do każdego procesu, a nawet całkowitej kwoty przydzielonej.

Kiedy użyłem mojego Mac przez 5 minut 95% mojego 3 GB pamięci RAM jest używany, a będzie to pobyt w ten sposób, nigdy nie idzie w dół. To tylko sposób, w jaki system operacyjny obsługuje pamięć.

Dopóki to nie jest potrzebne gdzie indziej nawet procesy, które mają rzucić jeszcze pamięć przypisaną do nich (może to uczynić je uruchomić szybciej następnym razem, na przykład).

Odpowiedział 14/08/2008 o 18:05
źródło użytkownik

głosy
19

(Nie jestem pewien o tym, ale ...)

AS3 używa niedeterministycznego zbierania śmieci. Co oznacza, że ​​pamięć przypisań zostaną uwolnione, gdy czas pracy czuje się jak to (zazwyczaj nie, chyba że istnieje powód, aby uruchomić, ponieważ jest to kosztowna operacja do wykonania). To samo podejście stosowane przez większość nowoczesnych śmieci zbierane językach (takich jak C # i Java również).

Zakładając, że nie istnieją żadne inne odniesienia do pamięci wskazywanego przez byteArraylub elementy w samej tablicy, pamięć zostanie zwolniona w pewnym momencie po wyjściu z zakresu gdzie byteArrayjest zadeklarowany.

Można wymusić zbieranie śmieci, choć tak naprawdę nie powinno. Jeśli tak, to zrobić tylko do testowania ... jeśli robisz to w produkcji, będzie bolało wydajność znacznie więcej niż na to poradzić.

Aby wymusić GC, spróbuj (tak, dwa razy):

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

Więcej można przeczytać tutaj .

Odpowiedział 01/08/2008 o 14:08
źródło użytkownik

głosy
15

Rzucić okiem na ten artykuł

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

IANA programista actionscript, jednak uczucie Dostaję jest to, że ponieważ garbage collector nie może działać, jeśli chcemy.

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

Więc polecam wypróbowanie ich kodu kolekcji i zobacz czy to pomaga

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();
}
Odpowiedział 01/08/2008 o 14:08
źródło użytkownik

głosy
13

Wierzę, że odpowiedziałeś na swoje pytanie ...

System.totalMemorydaje łączną ilość pamięci jest „używane”, nie przydzielony. Jest dokładny, że aplikacja może być wyłącznie przy użyciu 20MB, ale ma 5MB, który jest bezpłatny dla przyszłych przydziałów.

Nie jestem pewien, czy dokumentacja Adobe by rzucić światło na sposób, który zarządza pamięć ...

Odpowiedział 01/08/2008 o 15:03
źródło użytkownik

głosy
13

Niestety, jeśli chodzi o zarządzanie pamięcią w technologii Flash / ActionScript nie jest dużo można zrobić. ActionScript został zaprojektowany jako łatwy w użyciu (tak, że nie chcemy, aby ludzie muszą się martwić o zarządzanie pamięcią)

Poniżej znajduje się obejście, zamiast tworzenia ByteArrayzmiennej spróbować.

var byteObject:Object = new Object();

byteObject.byteArray = new ByteArray();

...

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

Gdzie byteArrayjest dynamiczną właściwość byteObject, można zwolnić pamięć, który został przydzielony do niego.

Odpowiedział 01/08/2008 o 14:14
źródło użytkownik

głosy
9

Tak więc, jeśli załadować powiedzieć 20MB z MySQL, w Menedżerze zadań RAM dla aplikacji idzie w górę o około 25MB. Potem, kiedy zamknąć połączenie i próbować wyrzucać ByteArray, nigdy RAM zwalnia. Jednakże, jeśli mogę użyć System.totalMemory, flash player pokazuje, że pamięć jest zwolniony, co nie jest prawdą.

Czy flash player robić coś jak Java i rezerwowania miejsca sterty i nie zwalniając go, aż aplikacja zostanie zamknięty?

No tak, a nie, jak można przeczytać z niezliczonych blogposts GC w AVM2 jest optymistą i będzie działać to własny tajemnicze sposoby. Tak to działa trochę jak Java i próbuje zarezerwować przestrzeń sterty, jednak jeśli go wystarczająco długo i zacząć robić inne operacje, które zużywają znaczącą pamięć będzie uwolnić iż wcześniejsze miejsca. Można to zobaczyć używając profilera ciągu nocy kilka testów uruchomiony na początku swojej aplikacji.

Odpowiedział 17/09/2008 o 11:09
źródło użytkownik

głosy
7

Tak więc, jeśli załadować powiedzieć 20MB z MySQL, w Menedżerze zadań RAM dla aplikacji idzie w górę o około 25MB. Potem, kiedy zamknąć połączenie i próbować wyrzucać ByteArray, nigdy RAM zwalnia. Jednakże, jeśli mogę użyć System.totalMemory, flash player pokazuje, że pamięć jest zwolniony, co nie jest prawdą.

Odtwarzacz jest „uwalniając” pamięć. Jeśli zminimalizować okno i przywrócić go należy zauważyć, że memeory jest teraz znacznie bliżej do jakich System.totalMemory pokazy.

Możesz być również zainteresowany wykorzystaniem narzędzi profilowania FlexBuilder, które można pokazać, czy naprawdę masz wycieków pamięci.

Odpowiedział 06/10/2008 o 19:16
źródło użytkownik


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