Domanda

Come faccio a scaricare con forza a ByteArray dalla memoria utilizzando ActionScript 3?

Ho provato quanto segue:

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

Nessuna soluzione corretta

Altri suggerimenti

Non penso che tu abbia nulla di cui preoccuparti.Se System.totalMemory va giù puoi rilassarti.Potrebbe benissimo essere il sistema operativo a non recuperare la memoria appena liberata (in previsione della prossima volta che Flash Player richiederà più memoria).

Prova a fare qualcos'altro che richiede molta memoria e sono sicuro che noterai che la memoria allocata a Flash Player diminuirà e verrà invece utilizzata per l'altro processo.

Da quanto ho capito, la gestione della memoria nei sistemi operativi moderni non è intuitiva dal punto di vista degli importi allocati a ciascun processo, o anche dell'importo totale allocato.

Quando utilizzo il mio Mac per 5 minuti, viene utilizzato il 95% dei miei 3 GB di RAM e rimarrà così, non si spegnerà mai.Questo è proprio il modo in cui il sistema operativo gestisce la memoria.

Finché non è necessario altrove, anche i processi che sono stati chiusi hanno ancora memoria assegnata loro (questo può farli avviare più velocemente la prossima volta, ad esempio).

(Non ne sono sicuro, ma...)

AS3 utilizza una garbage collection non deterministica.Ciò significa che la memoria senza riferimenti verrà liberata ogni volta che il runtime lo desidera (in genere no, a meno che non ci sia un motivo per eseguirlo, poiché è un'operazione costosa da eseguire).Questo è lo stesso approccio utilizzato dalla maggior parte dei moderni linguaggi di garbage collection (come anche C# e Java).

Supponendo che non ci siano altri riferimenti alla memoria indicata da byteArray o gli elementi all'interno dell'array stesso, la memoria verrà liberata ad un certo punto dopo l'uscita dall'ambito where byteArray è dichiarato.

Puoi forzare una raccolta dei rifiuti, anche se in realtà non dovresti.Se lo fai, fallo solo per prova...se lo fai in produzione, danneggerai le prestazioni molto più che aiutarle.

Per forzare un GC, prova (sì, due volte):

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

Puoi leggere di più qui.

Dai un'occhiata a questo articolo

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

Programmatore actionscript IANA, tuttavia la sensazione che ho è questa, perché il garbage collector potrebbe non funzionare quando lo desideri.

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

Quindi consiglierei di provare il loro codice di raccolta e vedere se aiuta

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

Credo che tu abbia risposto alla tua stessa domanda...

System.totalMemory fornisce la quantità totale di memoria "utilizzata", non allocata.È vero che la tua applicazione potrebbe utilizzare solo 20 MB, ma ha 5 MB gratuiti per assegnazioni future.

Non sono sicuro che i documenti Adobe possano far luce sul modo in cui gestisce la memoria...

Sfortunatamente quando si tratta di gestione della memoria in Flash/ActionScript non c'è molto che puoi fare.ActionScript è stato progettato per essere facile da usare (quindi non volevano che le persone dovessero preoccuparsi della gestione della memoria)

Quella che segue è una soluzione alternativa, invece di creare un file ByteArray variabile prova questo.

var byteObject:Object = new Object();

byteObject.byteArray = new ByteArray();

...

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

Dove byteArray è una proprietà dinamica di byteObject, è possibile liberare la memoria allocata.

Quindi, se carico diciamo 20 MB da MySQL, nel Task Manager la RAM per l'applicazione aumenta di circa 25 MB.Quindi quando chiudo la connessione e provo a eliminare ByteArray, la RAM non si libera mai.Tuttavia, se utilizzo System.totalMemory, Flash Player mostra che la memoria viene rilasciata, il che non è il caso.

Il Flash Player sta facendo qualcosa come Java e riserva spazio heap e non lo rilascia fino alla chiusura dell'app?

Ebbene sì e no, come potresti aver letto da innumerevoli post sul blog, il GC in AVM2 è ottimista e funzionerà in modi misteriosi.Quindi funziona un po' come Java e cerca di riservare spazio heap, tuttavia se lo lasci abbastanza a lungo e inizi a fare altre operazioni che consumano memoria significativa, libererà lo spazio precedente.Puoi vederlo utilizzando il profiler durante la notte con alcuni test in esecuzione sulla tua app.

Quindi, se carico diciamo 20 MB da MySQL, nel Task Manager la RAM per l'applicazione aumenta di circa 25 MB.Quindi quando chiudo la connessione e provo a eliminare ByteArray, la RAM non si libera mai.Tuttavia, se utilizzo System.totalMemory, Flash Player mostra che la memoria viene rilasciata, il che non è il caso.

Il lettore sta "rilasciando" la memoria.Se minimizzi la finestra e la ripristini dovresti vedere che la memoria è ora molto più vicina a ciò che mostra System.totalMemory.

Potresti anche essere interessato a utilizzare gli strumenti di profilazione di FlexBuilder che possono mostrarti se hai davvero perdite di memoria.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top