Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια

Πως να (μην) μειώσετε τη μνήμη που τρώει η εφαρμογής σας.

Eδώ και καιρό κυκλοφορεί σε διάφορα forum μια αμφιλεγόμενη τεχνική για τη μείωση της μνήμης που χρησιμοποιεί μια εφαρμογή. Η τεχνική αυτή βασίζεται στη χρήση του function SetProcessWorkingSet για να "ελευθερώσει" τη μνήμη που χρησιμοποιει. Αυτό που γίνεται ουσιαστικά, είναι ότι οι σελίδες της εφαρμογής που βρίσκονται στη μνήμη γράφονται στο pagefile και αφαιρούνται από τη μνήμη. Η εφαρμογή εξακολουθεί να χρησιμοποιεί την ίδια μνήμη συνολικά, στον Task Manager όμως θα φαίνεται σαν να χρησιμοποιεί λιγότερη RAM. Ενώ πριν η εφαρμογή φαινόταν να χρησιμοποιεί 10MB τώρα χρησιμοποιεί 2MB. Αντί όμως να αυξηθεί η ταχύτητα της εφαρμογής, βλέπει κανείς μια σημαντική καθυστέρηση! Τί έγινε?

Η κλήση στην SetProcessWorkingSet αναγκάσε τα Windows να βγάλουν από τη RAM σχεδόν όλες τις σελίδες που αφορούν την εφαρμογή. Οι σελίδες αυτές όμως δεν περιείχαν μόνο τις μεταβλητές της εφαρμογής αλλά και τα DLL που χρησιμοποιούσε, μεταξύ των οποίων είναι και τα DLL του .NET Framework. Όταν λοιπόν η εφαρμογή προσπαθήσει να κάνει ένα απλό redraw ή να ανταποκριθεί σε ένα mouse click, θα πρέπει να φορτώσει ξανά από την αρχή στη RAM τις σελίδες με τις μεταβλητές και τα DLL! Αυτό μπορεί να το διαπιστώσει κανείς αν προσθέσει στον Task Manager τη στήλη Page Fault Delta, η οποία δείχνει πόσα page faults έγιναν από την τελευταία ανανέωση. Και μετά, ας μετακινήσει το παράθυρο της εφαρμογής στην οθόνη. Ενώ πριν από την κλήση στην SetProcessWorkingSet το page fault delta είναι συνήθως 1 ή 0, μετά την κλήση γίνεται 600-900! Αμάν! Για ένα redraw γίνονται 600 page faults?! Μετά από λίγο πάντως, η χρήση της μνήμης θα επανέλθει στο αρχικό επίπεδο καθώς θα φορτωθούν ξανά όλες οι σελίδες μνήμης που είχαν φορτωθεί και στην αρχή.

Η τεχνική αυτή μπορεί να φανεί χρήσιμη σε μία μόνο πολύ περιορισμένη περίπτωση. Αν είμαστε σίγουροι ότι η εφαρμογή μας δεν θα χρησιμοποιηθεί για μεγάλο διάστημα, μπορούμε να καλέσουμε την SetProcessWorkingSet για να μεταφέρουμε στο pagefile όσο περισσότερες από τις σελίδες μνήμης χρησιμοποιεί η εφαρμογή έτσι ώστε να έχουμε διαθέσιμη RAM για κάποια άλλη βαριά εφαρμογή. Αυτό ακριβώς κάνουν και τα Windows όταν κάνουμε minimize μια εφαρμογή. Καλούν την SetProcessWorkingSet προκειμένου να υπάρχει περισσότερη διαθέσιμη μνήμη για τις εφαρμογές που εξακολουθούν να τρέχουν στο foreground.

Μεγάλη ευθύνη για την παρανόηση σχετικά με την SetProcessWorkingSet έχει και ο Task Manager, ή μάλλον όποιος αποφασίζει για τα ονόματα των δεικτών μνήμης που χρησιμοποιεί ο Task Manager. Αυτό που ο Task manager αποκαλεί Memory Usage είναι στην πραγματικότητα το Working Set, το οποίο περιέχει και σελίδες μνήμης οι οποίες χρησιμοποιούνται από πολλές εφαρμογές, όπως τα DLL του .NET Framework! Περισσότερα όμως για το τι σημαίνουν πραγματικά οι δείκτες και πως μπορείτε βρείτε πόση μνήμη χρησιμοποιεί στην πραγματικότητα μια εφαρμογή θα βρείτε στο προηγούμενο άρθρο, «Μα πού πήγε η μνήμη μου?»

Έχουν δημοσιευτεί Πέμπτη, 30 Μαρτίου 2006 12:06 πμ από το μέλος Παναγιώτης Καναβός

Ενημέρωση για Σχόλια

Αν θα θέλατε να λαμβάνετε ένα e-mail όταν γίνονται ανανεώσεις στο περιεχόμενο αυτής της δημοσίευσης, παρακαλούμε γίνετε συνδρομητής εδώ

Παραμείνετε ενήμεροι στα τελευταία σχόλια με την χρήση του αγαπημένου σας RSS Aggregator και συνδρομή στη Τροφοδοσία RSS με σχόλια

Σχόλια:

# re: Πως να (μην) μειώσετε τη μνήμη που τρώει η εφαρμογής σας.

Συγχαρητήρια, επιτέλους κάποιος που παίρνει τη σωστή θέση στο ζήτημα.

Έχω βρεθεί αντιμέτωπος με το εν λόγω tip χάρη στο StumbleUpon. Όταν το πρωτοείδα ήρθε στο μυαλό μου ο κανόνας που λέει "Memory cleaning tools == baaaaad!".

Με μια ματιά στο documentation στο site της MS, ο κανόνας επιβεβαιώθηκε.

Δευτέρα, 1 Οκτωβρίου 2007 3:00 μμ by Mitsaras

Ποιά είναι η άποψή σας για την παραπάνω δημοσίευση;

(απαιτούμενο) 
απαιτούμενο 
(απαιτούμενο) 
ÅéóÜãåôå ôïí êùäéêü:
CAPTCHA Image