Vykládání ByteArray pomocí Actionscript 3

hlasů
72

Jak mohu silně uvolnit ByteArrayz paměti pomocí ActionScript 3?

Zkoušel jsem následující:

// 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;
}
Položena 01/08/2008 v 13:30
zdroj uživatelem
V jiných jazycích...                            


8 odpovědí

hlasů
29

Nemyslím si, že máte něco bát. Pokud System.totalMemoryjde dolů si můžete odpočinout. To může být velmi dobře OS, který nemá kultivovat nově uvolněné paměti (v očekávání příští Flash Player požádá o více paměti).

Zkuste dělat něco jiného, ​​že je velmi náročné na paměť a jsem si jistý, že si všimnete, že přidělené paměti Flash Player sníží a mohou být použity pro další proces místo.

Jak jsem to pochopil, správa paměti v moderních operačních systémech není intuitivní z hlediska pohledu na částky přidělené na každý proces, nebo dokonce celkové částky přidělené.

Když jsem použil můj Mac po dobu 5 minut se použije 95% z mých 3 GB RAM, a to zůstane takhle, nikdy klesá. To je přesně tak, jak operační systém zpracovává paměti.

Tak dlouho, dokud to není potřeba jinde i procesy, které přestat ještě paměť přiřazenou k nim (to může učinit je spustit rychlejší příště, například).

Odpovězeno 14/08/2008 v 18:05
zdroj uživatelem

hlasů
19

(Nejsem pozitivní, o tom, ale ...)

AS3 používá non-deterministický garbage collection. Což znamená, že neodkazované paměť se uvolní, když runtime zachce (typicky pokud je tu důvod ke spuštění, protože je to nákladná operace spustit). Jedná se o stejný postup se používá ve většině moderních odpadky shromažďují jazyků (jako je C # a Java stejně).

Za předpokladu, že se žádné další odkazy na paměti, na kterou ukazuje byteArraynebo předměty uvnitř samotné pole, bude paměť bude uvolněna v určitém okamžiku po ukončení působnosti, kde byteArrayje deklarována.

Můžete vynutit odvoz odpadu, i když ve skutečnosti neměl. Pokud ano, to pouze pro testování ... pokud si to ve výrobě, budete bolet výkon mnohem víc, než pomoci.

Přinutit GC, zkusit (ano, dvakrát):

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

Víc můžete přečíst zde .

Odpovězeno 01/08/2008 v 14:08
zdroj uživatelem

hlasů
15

Podívejte se na tento článek

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

IANA actionscript programátor, ale ten pocit jsem stále je to proto, že garbage collector nemusí spustit, pokud chcete, aby to.

Z tohoto důvodu http://www.craftymind.com/2008/04/09/kick-starting-the-garbage-collector-in-actionscript-3-with-air/

Takže bych doporučil vyzkoušet svůj kód sbírky a uvidíme, jestli to pomůže

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();
}
Odpovězeno 01/08/2008 v 14:08
zdroj uživatelem

hlasů
13

Věřím, že jste odpověděli svou vlastní otázku ...

System.totalMemoryvám dává celkové množství paměti bytí „použitý“, není přidělena. To je přesné, že aplikace může být pouze pomocí 20MB, ale to má 5 MB, která je zdarma pro budoucí příděly.

Nejsem si jistý, jestli Adobe docs by osvětlit tak, že řídí paměť ...

Odpovězeno 01/08/2008 v 15:03
zdroj uživatelem

hlasů
13

Bohužel, pokud jde o správu paměti v programu Flash / ActionScript není spoustu, co můžete udělat. ActionScript byl navržen tak, aby bylo snadné použití (tak oni nechtěli, aby lidé měli starat o správu paměti)

Vkládá je řešení, namísto vytváření ByteArrayvariabilní zkusit.

var byteObject:Object = new Object();

byteObject.byteArray = new ByteArray();

...

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

Tam, kde byteArrayje dynamická vlastnost byteObject, můžete uvolnit paměť, která byla přidělena pro něj.

Odpovězeno 01/08/2008 v 14:14
zdroj uživatelem

hlasů
9

Takže, když jsem nahrát říci 20MB z MySQL, ve Správci úloh paměti RAM pro aplikace zvedne o cca 25 MB. Pak, když jsem se ukončit připojení a zkuste s nimi naložit ByteArray, RAM nikdy uvolní. Nicméně, pokud mohu použít System.totalMemory, flash player ukazuje, že paměť je uvolněna, což není tento případ.

Je flash player dělat něco podobného Javě a rezervací haldy prostor a neuvolňuje, dokud se aplikace ukončí?

No ano a ne, jak jste mohli číst z nesčetných blogu příspěvky GC v AVM2 je optimistický a bude pracovat svou vlastní nevyzpytatelné. Tak to funguje trochu jako Javě a pokusí vyhradit haldy prostor, takže pokud jej necháte dostatečně dlouho a začít dělat další operace, které se spotřebovávají nějakou významnou paměti, dojde k uvolnění, že předchozí prostoru. Můžete vidět pomocí Profiler přes noc se některé testy běží na vrcholu své aplikace.

Odpovězeno 17/09/2008 v 11:09
zdroj uživatelem

hlasů
7

Takže, když jsem nahrát říci 20MB z MySQL, ve Správci úloh paměti RAM pro aplikace zvedne o cca 25 MB. Pak, když jsem se ukončit připojení a zkuste s nimi naložit ByteArray, RAM nikdy uvolní. Nicméně, pokud mohu použít System.totalMemory, flash player ukazuje, že paměť je uvolněna, což není tento případ.

Hráč je „uvolnění“ paměti. Pokud minimalizujete okno a obnovit ji, měli byste vidět, že memeory je nyní mnohem blíže k čemu System.totalMemory show.

Mohlo by vás zajímat pomocí profilování nástroje FlexBuilder, která vám může ukázat, jestli máte skutečně nevracení paměti.

Odpovězeno 06/10/2008 v 19:16
zdroj uživatelem


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