
Πώς μπορώ βίαια ξεφορτώνουν ένα `ByteArray`από τη μνήμη χρησιμοποιώντας το ActionScript 3;


Έχω δοκιμάσει τα εξής:



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

```
 
Εκφόρτωση ενός ByteArray χρησιμοποιώντας Actionscript 3
=======================================================



Ρίξτε μια ματιά σε αυτό το άρθρο


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


IANA ActionScript προγραμματιστής, όμως η αίσθηση που παίρνω είναι ότι, επειδή ο συλλέκτης σκουπιδιών μπορεί να μην τρέξει όταν θέλετε να.


Ως εκ τούτου
 <http://www.craftymind.com/2008/04/09/kick-starting-the-garbage-collector-in-actionscript-3-with-air/>


Γι 'αυτό ήθελα να συστήσει να δοκιμάσουν τον κωδικό συλλογής τους και να δούμε αν αυτό βοηθάει



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

```
 

(Δεν είμαι θετικός σχετικά με αυτό, αλλά ...)


AS3 χρησιμοποιεί μια μη-ντετερμινιστική συλλογή σκουπιδιών. Πράγμα που σημαίνει ότι unreferenced μνήμης θα πρέπει να απελευθερωθούν κάθε φορά που το runtime αισθάνεται σαν αυτό (συνήθως όχι, εκτός αν υπάρχει ένας λόγος για να τρέξει, δεδομένου ότι είναι ένα ακριβό λειτουργία για να εκτελέσει). Αυτή είναι η ίδια προσέγγιση που χρησιμοποιείται από τα περισσότερα σύγχρονα σκουπίδια που συλλέγονται γλώσσες (όπως η C # και Java, καθώς και).


Υποθέτοντας ότι υπάρχει κανένα άλλο αναφορές στη μνήμη που υποδεικνύεται από `byteArray`ή τα στοιχεία μέσα στην ίδια την σειρά, η μνήμη θα απελευθερωθεί σε κάποιο σημείο μετά την έξοδό σας από το πεδίο όπου `byteArray`έχει δηλωθεί.


Μπορείτε να επιβάλετε μια συλλογή των απορριμμάτων, αν και πραγματικά δεν θα έπρεπε. Αν το κάνετε, το κάνετε μόνο για τη δοκιμή ... αν το κάνεις στην παραγωγή, θα βλάψει την απόδοση πολύ περισσότερο από ό, τι σας βοηθήσει.


Για να επιβάλετε μια GC, δοκιμάστε (ναι, δύο φορές):



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

```

[Μπορείτε να διαβάσετε περισσότερα εδώ](http://www.craftymind.com/2008/04/09/kick-starting-the-garbage-collector-in-actionscript-3-with-air/) .

 

Δυστυχώς, όταν πρόκειται για τη διαχείριση της μνήμης σε *Flash / ActionScript* δεν υπάρχει ένα πάρα πολύ που μπορείτε να κάνετε. ActionScript σχεδιάστηκε για να είναι εύκολο στη χρήση (έτσι δεν θέλουν οι άνθρωποι να χρειάζεται να ανησυχείτε για τη διαχείριση της μνήμης)


Το παρακάτω είναι μια λύση, αντί να δημιουργήσει μια `ByteArray`μεταβλητή δοκιμάστε αυτό.



```
var byteObject:Object = new Object();

byteObject.byteArray = new ByteArray();

...

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

```

Πού `byteArray`είναι μια δυναμική ιδιότητα `byteObject`, μπορείτε να ελευθερώσετε τη μνήμη που διατέθηκε γι 'αυτό.

 

Πιστεύω ότι έχετε απαντήσει την ερώτησή σας ...


`System.totalMemory`σας δίνει το συνολικό ποσό της μνήμης που «χρησιμοποιούνται», που δεν έχει ανατεθεί. Είναι ακριβές ότι η εφαρμογή σας μπορεί να είναι μόνο με 20MB, αλλά έχει 5MB που είναι δωρεάν για μελλοντικές κατανομές.


Δεν είμαι σίγουρος αν τα έγγραφα Adobe θα ρίξει φως στον τρόπο που διαχειρίζεται τη μνήμη ...

 

Δεν νομίζω ότι έχετε κάτι να ανησυχούν. Αν `System.totalMemory`κατεβαίνει μπορείτε να χαλαρώσετε. Μπορεί κάλλιστα να είναι το λειτουργικό σύστημα που δεν διεκδικήσει εκ νέου την πρόσφατα απελευθερωθεί μνήμη (εν αναμονή του επόμενου χρόνου Flash Player θα ζητήσει περισσότερη μνήμη).


Δοκιμάστε να κάνετε κάτι άλλο που είναι πολύ απαιτητικές σε μνήμη και είμαι βέβαιος ότι θα παρατηρήσετε ότι η μνήμη που διατίθεται σε Flash Player θα μειωθεί και να χρησιμοποιηθεί για την άλλη διαδικασία αντ 'αυτού.


Όπως έχω καταλάβει, διαχείριση μνήμης στη σύγχρονη OS δεν είναι έξυπνο από την πλευρά του κοιτάζοντας τα ποσά που διατίθενται σε κάθε διαδικασία, ή ακόμα και το συνολικό ποσό που θα διατεθεί.


Όταν έχω χρησιμοποιήσει το Mac μου για 5 λεπτά χρησιμοποιείται το 95% του μου 3 GB RAM, και θα παραμείνει έτσι, ποτέ δεν πηγαίνει προς τα κάτω. Αυτός είναι ακριβώς ο τρόπος που το λειτουργικό σύστημα διαχειρίζεται τη μνήμη.


Εφ 'όσον δεν χρειάζεται αλλού, ακόμη και διαδικασιών που έχουν εγκαταλείψει ακόμη τη μνήμη τους έχει ανατεθεί (αυτό μπορεί να τους κάνει να ξεκινήσει πιο γρήγορα την επόμενη φορά, για παράδειγμα).

 


> 
> Έτσι, αν φορτώσετε πω 20MB από την MySQL, στη Διαχείριση εργασιών η μνήμη RAM για την εφαρμογή ανεβαίνει κατά περίπου 25MB. Στη συνέχεια, όταν κλείσετε τη σύνδεση και να προσπαθήσει να διαθέσει το ByteArray, η μνήμη RAM δεν απελευθερώνει. Ωστόσο, αν μπορώ να χρησιμοποιήσω System.totalMemory, flash player δείχνει ότι η μνήμη που έχει κυκλοφορήσει, το οποίο δεν συμβαίνει.
> 
> 
> Είναι ο παίκτης φλας κάνει κάτι όπως η Java και η δέσμευση χώρου σωρό και να μην απελευθερώνει μέχρι κλείνει η εφαρμογή;
> 
> 
> 


Καλά ναι και όχι, όπως ίσως έχετε διαβάσει από αμέτρητες blogposts η GC στο AVM2 είναι αισιόδοξος και θα λειτουργήσει το δικό τους μυστήριους τρόπους. Γι 'αυτό δεν λειτουργεί λίγο σαν Java και προσπαθεί να διατηρήσει χώρο σωρού, ωστόσο, αν αφήσετε αρκετό καιρό και να αρχίσει να κάνει άλλες λειτουργίες που καταναλώνουν κάποια σημαντική μνήμη θα απελευθερώσει αυτό το προηγούμενο διάστημα. Μπορείτε να δείτε αυτό με τη χρήση του profiler μέσα σε μια νύχτα με κάποιες δοκιμές τρέχει στην κορυφή της εφαρμογής σας.

 


> 
> Έτσι, αν φορτώσετε πω 20MB από την MySQL, στη Διαχείριση εργασιών η μνήμη RAM για την εφαρμογή ανεβαίνει κατά περίπου 25MB. Στη συνέχεια, όταν κλείσετε τη σύνδεση και να προσπαθήσει να διαθέσει το ByteArray, η μνήμη RAM δεν απελευθερώνει. Ωστόσο, αν μπορώ να χρησιμοποιήσω System.totalMemory, flash player δείχνει ότι η μνήμη που έχει κυκλοφορήσει, το οποίο δεν συμβαίνει.
> 
> 
> 


Ο παίκτης είναι «απελευθέρωση» της μνήμης. Αν ελαχιστοποιήσετε το παράθυρο και να το επαναφέρετε θα πρέπει να δούμε ότι η memeory είναι τώρα πολύ πιο κοντά σε αυτό που System.totalMemory παραστάσεις.


Μπορεί επίσης να σας ενδιαφέρει χρησιμοποιώντας τα εργαλεία προφίλ FlexBuilder, η οποία μπορεί να σας δείξει αν έχετε πραγματικά διαρροές μνήμης.

 

Χρησιμοποιήστε αυτούς τους πόρους: 


<http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b8cbfe-7ff7.html>


και αυτό


<http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b8cbfe-7ff7.html>

 