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

ψήφοι
72

Πώς μπορώ βίαια ξεφορτώνουν ένα 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;
}
Δημοσιεύθηκε 01/08/2008 στις 13:30
πηγή χρήστη
Σε άλλες γλώσσες...                            


8 απαντήσεις

ψήφοι
29

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

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

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

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

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

Απαντήθηκε 14/08/2008 στις 18:05
πηγή χρήστη

ψήφοι
19

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

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

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

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

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

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

Μπορείτε να διαβάσετε περισσότερα εδώ .

Απαντήθηκε 01/08/2008 στις 14:08
πηγή χρήστη

ψήφοι
15

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

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();
}
Απαντήθηκε 01/08/2008 στις 14:08
πηγή χρήστη

ψήφοι
13

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

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

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

Απαντήθηκε 01/08/2008 στις 15:03
πηγή χρήστη

ψήφοι
13

Δυστυχώς, όταν πρόκειται για τη διαχείριση της μνήμης σε 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, μπορείτε να ελευθερώσετε τη μνήμη που διατέθηκε γι 'αυτό.

Απαντήθηκε 01/08/2008 στις 14:14
πηγή χρήστη

ψήφοι
9

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

Είναι ο παίκτης φλας κάνει κάτι όπως η Java και η δέσμευση χώρου σωρό και να μην απελευθερώνει μέχρι κλείνει η εφαρμογή;

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

Απαντήθηκε 17/09/2008 στις 11:09
πηγή χρήστη

ψήφοι
7

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

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

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

Απαντήθηκε 06/10/2008 στις 19:16
πηγή χρήστη

Απαντήθηκε 24/07/2014 στις 05:48
πηγή χρήστη

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