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

Μα που πήγε η μνήμη μου?

Φτιάχνω μια ωραία, μικρή εφαρμογή σε .NET η οποία εμφανίζει ένα απλό Hello World και δύο κουμπάκια, την τρέχω και κοιτάζω στον Task Manager πόση μνήμη χρησιμοποιεί. Και τί βλέπω? Η μικρή εφαρμογή χρησιμοποιεί 10 MB! Μα είναι δυνατόν? Μήπως όλες οι εφαρμογές .NET είναι μνημοβόρα τερατουργήματα?

Φυσικά η κατάσταση δεν είναι τόσο τραγική. Για να καταλάβει κανείς τί συμβαίνει θα πρέπει να καταλάβει τί σημαίνουν πραγματικά οι ενδείξεις του Task Manager και πως διαχειρίζονται τη μνήμη τα Windows. Όταν ξεκινάει μια εφαρμογή, τα Windows φορτώνουν στη μνήμη το exe της εφαρμογής αλλά και τα DLL, αν αυτά δεν έχουν ήδη φορτωθεί στη μνήμη. Επίσης, δίνουν ένα χώρο στη μνήμη για να δημιουργεί τις μεταβλητές της. Τώρα, αν τα DLL έχουν ήδη φορτωθεί από κάποια άλλη εφαρμογή, τα Windows δεν θα τα ξαναφορτώσουν αλλά θα χρησιμοποιήσουν τα DLL που υπάρχουν ήδη στη μνήμη. Τα bytes αυτά τα οποία μπορούν να μοιραστούν μεταξύ εφαρμογών ονομάζονται shared bytes. Τα bytes που αφορούν αποκλειστικά την εφαρμογή και δεν μοιράζονται με άλλα processes ονομάζονται ... private bytes. Όλα αυτά τα bytes δεν βρίσκονται συνέχεια στη RAM. Μόνο ένα υποσύνολό τους βρίσκεται κάθε στιγμή στη RAM ενώ τα υπόλοιπα βρίσκονται στο pagefile. Το σύνολο της RAM που χρησιμοποιεί κάθε στιγμή μία εφαρμογή λέγεται Working Set της εφαρμογής.

Και εδώ είναι το κόλπο. Το Working set περιλαμβάνει ΚΑΙ private bytes ΚΑΙ shared bytes! Από τα 10ΜΒ που πιάνει η εφαρμογούλα μου, τα 8ΜΒ είναι shared bytes!

Μα καλά, θα πείτε, γιατί ο Task Manager δείχνει memory usage 10ΜΒ? Γιατί ο Task Manager περιγράφει τα ήδη μνήμης με λάθος ονόματα. Αυτό που ο Task Manager περιγράφει σαν Memory Usage είναι όλο το Working Set. Αυτό που περιγράφει σαν Virtual Memory είναι τα private bytes. Αλλά, όπως είπαμε, τα private bytes μπορεί να βρίσκονται στη RAM, μπορεί να βρίσκονται και στο pagefile. Το πραγματικό μέγεθος της Virtual Memory που χρησιμοποιείται από μια εφαρμογή δεν φαίνεται πουθενά!

Αν θέλει κανείς να δει πραγματικά πόση μνήμη πιάνει η εφαρμογή του θα πρέπει να χρησιμοποιήσει είτε τους δείκτες του Performance Monitor ή ένα εργαλείο όπως το Process Explorer της Sysinternals, το οποίο δείχνει αναλυτικά τη χρήση της μνήμης για κάθε εφαρμογή. Και είναι και δωρεάν!

Τελικά? Τί περιέχουν τα 8MB shared memory που χρησιμοποιεί η εφαρμογή μου? Μα τα DLLs τόσο της εφαρμογής όσο και του framework!

Έχουν δημοσιευτεί Τετάρτη, 29 Μαρτίου 2006 11:56 μμ από το μέλος Παναγιώτης Καναβός

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

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

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

Σχόλια:

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

Eδώ και καιρό κυκλοφορεί σε διάφορα forum μια αμφιλεγόμενη τεχνική για τη μείωση της μνήμης που χρησιμοποιεί...
Πέμπτη, 30 Μαρτίου 2006 12:24 πμ by Panagiotis Kanavos' Weblog

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

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