Ανατομία ενός «Memory Leak»




Σε .NET προοπτική:


* Τι είναι **[Διαρροή μνήμης](http://en.wikipedia.org/wiki/Memory_leak)** ;
* Πώς μπορείτε να προσδιορίσετε αν διαρροές αίτησή σας; Ποιες είναι οι συνέπειες;
* Πώς μπορείτε να αποφευχθεί η διαρροή μνήμης;
* Εάν η εφαρμογή σας έχει απώλεια μνήμης, δεν θα πάει μακριά, όταν η διαδικασία εξέρχεται ή σκοτώνεται; Ή μήπως διαρροές μνήμης στην εφαρμογή σας επηρεάζουν άλλες διεργασίες στο σύστημα, ακόμη και μετά την ολοκλήρωση της διαδικασίας;
* Και τι γίνεται με μη διαχειριζόμενο κώδικα πρόσβαση μέσω COM διαλειτουργικότητα ή / και P / Κλήση;
Η καλύτερη εξήγηση που έχω δει είναι στο κεφάλαιο 7 των ελεύθερων [Ιδρύματα Προγραμματισμού e-book](http://codebetter.com/karlseguin/2008/06/25/foundations-of-programming-ebook/) .


Βασικά, σε **ΝΕΤ** παρουσιάζεται διαρροή μνήμης όταν τα αντικείμενα αναφοράς τις ρίζες και έτσι δεν μπορεί να σκουπίδια συλλέγονται. Αυτό συμβαίνει κατά λάθος, όταν κρατάτε για τις αναφορές πέρα από το σκοπούμενο πεδίο εφαρμογής.


Θα γνωρίζετε ότι έχετε διαρροές όταν ξεκινάτε να πάρει OutOfMemoryExceptions ή τη χρήση της μνήμης σας ανεβαίνει πέρα από αυτό που θα περίμενε κανείς ( **PerfMon** έχει ωραία μετρητές μνήμης).


Κατανόηση **ΝΕΤ** μοντέλο μνήμης «s είναι ο καλύτερος τρόπος για σας να αποφευχθεί αυτό. Συγκεκριμένα, την κατανόηση του πώς λειτουργεί ο συλλέκτης σκουπιδιών και πώς αναφορές λειτουργούν - και πάλι, σας παραπέμπω στο κεφάλαιο 7 του e-book. Επίσης, να λαμβάνει υπόψη της τις κοινές παγίδες, ίσως τα πιο κοινά είναι τα γεγονότα. Εάν το αντικείμενο **Α** έχει καταχωρηθεί σε μια εκδήλωση στο αντικείμενο **Β** , τότε αντιρρήσεις **Α** θα μείνω μέχρι το αντικείμενο **Β** εξαφανιστεί λόγω **B** κατέχει αναφορά στο **Α** . Η λύση είναι να καταργήσετε τις εκδηλώσεις σας, όταν τελειώσετε.


Φυσικά, ένα καλό προφίλ μνήμης θα σας αφήσει να δείτε το αντικείμενο γραφήματα σας και να εξερευνήσετε το φώλιασμα / αναφορά των αντικειμένων σας για να δείτε πού είναι οι αναφορές προέρχονται από και ποια ρίζα αντικείμενο είναι υπεύθυνος ( [προφίλ μυρμήγκια κόκκινο-πύλη](http://www.red-gate.com/products/ants_memory_profiler/index.htm) , JetBrains dotMemory, [memprofiler](http://memprofiler.com/) είναι πραγματικά καλό επιλογές, ή μπορείτε να χρησιμοποιήσετε το κείμενο-μόνο **WinDbg** και **SOS** , αλλά θα ήθελα να συνιστούμε ένα εμπορικό / οπτική του προϊόντος, εκτός αν είστε ένας πραγματικός γκουρού).


Πιστεύω μη διαχειριζόμενο κώδικα υπόκειται σε τυπικό διαρροές μνήμης, εκτός από το ότι μοιράζονται τις αναφορές που διαχειρίζεται τον συλλέκτη σκουπιδιών. Μπορεί να κάνω λάθος σχετικά με αυτό το τελευταίο σημείο.
εννοειται με λογαριασμο.

κανει καποια νερα τωρα με τις νεες εκδοσεις των διανομων.

δεν κραταει στην μνημη τα αρχεια που κατεβαζεις. αν τον κλεισεις χανονται ολα.

αντιθετα το πρωτο download κατα παραδοξο τροπο δεν το χανει ποτε, το σβηνεις δεν το σβηνεις, ειναι εκει παντα.

γενικα δεν συμπεριφερετ… λοιπόν αν κατάλαβα σωστά η διαρροή εμφανίζεται στην βαλβίδα του κλειστού κυκλώματος. σε αυτή την περίπτωση θα περιμένετε μερικές ημέρες για να δείτε αν η διαρροή σταματήσει δεδομένου ότι μετά από πλήρες γέμισμα του κλειστού κυκλώματος έχουμε μερικές φορές λόγω διαστολών διαρροή από την βαλβίδα αυτή. σε αυτή την περίπτωση μετά από μερικές μέρες θα σταματήσει . αν όμως συνεχίσει τότε έχουμε διαρροή νερού (σε αρχικό στάδιο) από το νερό χρήσης προς το κλειστό κύκλωμα και αυτή η διαρροή σταδιακά θα αυξηθεί , αυτή η διαρροή αλειώνει την αναλογία αντιψυκτικού με αποτέλεσμα να μη υπάρχει η αναγκαία προστασία των συλλεκτών σε περίπτωση παγετού και η μόνη λύση είναι η αντικατάσταση του μπόιλερ, και σε αυτή την περίπτωση θέλει προσοχή μην μπεί μεγαλύτερη βαλβίδα ασφαλείας γιατί κινδυνεύουν να τρυπήσουν οι συλλέκτες από την πίεση του νερού χρήσης. τρουλλινός γιώργος, υδραυλικός, 6932860310. εφόσον ο δικός σας τοίχος δεν έχει σε σχέση με τοίχο που από την άλλη του πλευρά να υπάρχει κάποιο πατάρι με σωλήνες, τότε οι υποψίες περιορίζονται στο (α) τι μπορεί να περνά μέσα από τον τοίχο πχ σωλήνες υδρορροής ή αποχέτευσης ή καλώδια ηλεκτρολογικά που μπορεί να φέρνουν υγρασία από πχ βροχή ή ηλιακούς της ταράτσας, ή (β) σε διαρροή σωλήνων του – των επάνω διαμερισμάτων ή κάποια χρήση πχ πλύσιμο μπαλκονιού ή νερά της βροχής. η παρατήρηση από σας αν αυξάνεται ή όχι η υγρασία και πότε, μπορεί να βοηθήσει στα αναγκαία συμπεράσματα, επίσης αν γίνει έλεγχος με θερμική κάμερα πιθανότατα να βγεί κάποιο συμπέρασμα πιο γρήγορα. το ενδιαφέρον των από πάνω για το πρόβλημα των από κάτω το διατηρούμε ‘θερμό’ αναφέροντας συχνά ότι στο τέλος την αποκατάσταση του τοίχου και των άλλων ζημιών θα την επιβαρυνθεί το διαμέρισμα που είχε το πρόβλημα ή τα κοινόχρηστα αν η διαρροή είναι από εκεί. τρουλλινός γιώργος , υδραυλικός, αθήνα , αττική, 6932860310. οι υγρασίες και οι διαρροές που είναι σχετικές με την μπανιέρα είναι χοντρικά οι παρακάτω. διαρροή από τρύπια εσωτερική σωλήνα παροχής νερού, διαρροή από την σύνδεση της μπαταρίας με την εσωτερική σωλήνα, διαρροή από τους αρμούς των πλακιδίων, διαρροή από την βαλβίδα της μπανιέρας και διαρροή από την σωλήνα αποχέτευσης της μπανιέρας. βέβαια στον χώρο αυτόν μπορεί να εμφανιστούν διαρροές και υγρασίες και από σωλήνες πχ κεντρικής αποχέτευσης αν περνάνε από εκεί ή διαρροές από το πατάρι αν υπάρχει και έχει παρουσιάσει διαρροή που οδηγείται μέσα από τα τούβλα στο δάπεδο κλπ. τρουλλινός γιώργος , υδραυλικός , αθήνα , αττική , 6932860310. Έκανα τα εξής:


Αποθηκεύεται αυτόματα στη βάση δεδομένων κάθε φορά που κάτι νέο ήρθε.


Στη συνέχεια έτρεξε ένα php βρόχο που κάθε λίγα λεπτά ελέγχονται για να διαπιστωθεί αν υπάρχει κάτι νέο στη βάση δεδομένων που ταιριάζει με τις παραμέτρους του νέου αυτού συμβάντος (συμπεριλαμβανομένων ότι happenned εντός του χρονικού πλαισίου των τελευταίων λεπτών). Θα χρησιμοποιηθεί `flush();`και στη συνέχεια `sleep(120);`στο βρόχο για να πάρει το βρόχο για να συνεχίσει να τρέχει κάθε λίγα λεπτά, έως ότου η νέα info ήρθε στην οποία περίπτωση θα `break();`ή `die();`. λοιπόν αν κατάλαβα σωστά η διαρροή εμφανίζεται στην βαλβίδα του κλειστού κυκλώματος. σε αυτή την περίπτωση θα περιμένετε μερικές ημέρες για να δείτε αν η διαρροή σταματήσει δεδομένου ότι μετά από πλήρες γέμισμα του κλειστού κυκλώματος έχουμε μερικές φορές λόγω διαστολών διαρροή από την βαλβίδα αυτή. σε αυτή την περίπτωση μετά από μερικές μέρες θα σταματήσει . αν όμως συνεχίσει τότε έχουμε διαρροή νερού (σε αρχικό στάδιο) από το νερό χρήσης προς το κλειστό κύκλωμα και αυτή η διαρροή σταδιακά θα αυξηθεί , αυτή η διαρροή αλειώνει την αναλογία αντιψυκτικού με αποτέλεσμα να μη υπάρχει η αναγκαία προστασία των συλλεκτών σε περίπτωση παγετού και η μόνη λύση είναι η αντικατάσταση του μπόιλερ, και σε αυτή την περίπτωση θέλει προσοχή μην μπεί μεγαλύτερη βαλβίδα ασφαλείας γιατί κινδυνεύουν να τρυπήσουν οι συλλέκτες από την πίεση του νερού χρήσης. τρουλλινός γιώργος 6932860310 υδραυλικές εργασίες σε όλη την αθήνα - αττική παλλήνη, μοσχάτο, νέα χαλκηδόνα, μαρούσι, μέτς εφόσον ο δικός σας τοίχος δεν έχει σε σχέση με τοίχο που από την άλλη του πλευρά να υπάρχει κάποιο πατάρι με σωλήνες, τότε οι υποψίες περιορίζονται στο (α) τι μπορεί να περνά μέσα από τον τοίχο πχ σωλήνες υδρορροής ή αποχέτευσης ή καλώδια ηλεκτρολογικά που μπορεί να φέρνουν υγρασία από πχ βροχή ή ηλιακούς της ταράτσας, ή (β) σε διαρροή σωλήνων του – των επάνω διαμερισμάτων ή κάποια χρήση πχ πλύσιμο μπαλκονιού ή νερά της βροχής. η παρατήρηση από σας αν αυξάνεται ή όχι η υγρασία και πότε, μπορεί να βοηθήσει στα αναγκαία συμπεράσματα, επίσης αν γίνει έλεγχος με θερμική κάμερα πιθανότατα να βγεί κάποιο συμπέρασμα πιο γρήγορα. το ενδιαφέρον των από πάνω για το πρόβλημα των από κάτω το διατηρούμε ‘θερμό’ αναφέροντας συχνά ότι στο τέλος την αποκατάσταση του τοίχου και των άλλων ζημιών θα την επιβαρυνθεί το διαμέρισμα που είχε το πρόβλημα ή τα κοινόχρηστα αν η διαρροή είναι από εκεί. τρουλλινός γιώργος 6932860310 υδραυλικές εργασίες σε όλη την αθήνα - αττική βύρωνας, ασπρόπυργος, αθήνα, νέος κόσμος, ηλιούπολη, βούλα Η προτιμώμενη μέθοδος είναι να χρησιμοποιήσετε πραγματικά την ιδιότητα υπό όρους για να τυλίξει τις κλήσεις εντοπισμού σφαλμάτων σας, μην χρησιμοποιήσετε τις οδηγίες μεταγλωττιστή. #ifs μπορεί να πάρει δύσκολες και μπορεί να οδηγήσει σε περίεργα προβλήματα κατασκευής.


Ένα παράδειγμα της χρήσης ενός υπό όρους χαρακτηριστικό είναι η εξής (σε C #, αλλά λειτουργεί σε VB.NET πολύ):



```
[ Conditional("Debug") ]
private void WriteDebug(string debugString)
{
  // do stuff
}

```

Κατά τη μεταγλώττιση, χωρίς το σετ σημαία DEBUG, κάθε κλήση προς WriteDebug θα καταργηθούν όπως υποτίθεται συνέβαινε με Debug.Write (). για να ρωτήσει και να σταματήσει αν πατήσεις κάτι άλλο εκτός από `y’ ή ‘y’

read -p "are you sure? " -n 1 -r

echo # (optional) move to a new line

if [[ ! $reply =~ ^[yy]$ ]]

then

echo -ne "\ncancelled\n"

exit 1

fi

echo -ne "\n"

το μυστικό είναι η κανονική έκφραση (regular experssion) '^[y… είναι αλήθεια ότι μου πέρασε κάποια στιγμή από το μυαλό να “σηκώσω” ένα arch δοκιμαστικά κατ αρχήν στο netbook (μάλλον επηρεάστηκα από τον [@billniakas](/u/billniakas)) αλλά φοβήθηκα ότι “τα νερά θα είναι βαθειά” :blush:. αφού όλα δουλεύουν το αφήνω για αργότερα όταν, και αν, ξαναδημιουργηθεί πρόβλημα.

τώρα έχει μ…