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

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Memory leaks σε managed κώδικα ???

Îåêßíçóå áðü ôï ìÝëïò anjelinio. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 09-10-2006, 15:13. Υπάρχουν 10 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  06-10-2006, 12:37 18162

    Memory leaks σε managed κώδικα ???

    "Κάποτε ήταν πολύ εύκολο να εισάγουμε memory leaks στο πρόγραμμά μας, γράφοντας σε C / C++. Οι περισσότεροι πιστεύουμε οτι στον managed πλέον κόσμο, το memory leak είναι απλώς ... non-issue". Λάθος !

    Στο συγκεκριμένο blog post, ο κύριος Mike Bloise εξιστορεί τη memory leaked εμπειρία του, καθώς και τη χρήση του ANTS Profiler για να βρεί τη λύση στο πρόβλημά του. Πολύ ενδιαφέρον διάβασμα, ίσως ταρακουνήσει πολλούς απο 'μας να ξανασκεφτούν κάποια πράγματα για τον κώδικά μας :)



    Angel
    O:]
  •  06-10-2006, 13:10 18165 σε απάντηση της 18162

    Απ: Memory leaks σε managed κώδικα ???

    Χμμμ... Memory leak? Φταίει ο managed κώδικας αν ο τύπος όρισε static ArrayList και δεν φρόντισε να το αδειάζει; Το managed περιβάλλον κάνει αυτό που πρόκειται να κάνει, θα κάνει deallocate όταν δεν υπάρχει reference στο ArrayList, δηλαδή όταν κλείσει την εφαρμογή. Θα το έλεγα memory leak αν δεν ελευθερόνονταν η μνήμη αφού έκλεινε η εφαρμογή...

    OK, το δεύτερο με τους event handlers είναι ένα θέμα και το έχουμε πει ότι χρειάζεται προσοχή... Αλλά και πάλι, GC.Collect?!?!


    Vir prudens non contra ventum mingit
  •  06-10-2006, 13:44 18168 σε απάντηση της 18162

    Απ: Memory leaks σε managed κώδικα ???

    Ο KelMan έχει δίκιο. Ο GC δεν είναι καφετζού για να μαντέψει ότι τα controls που περνάνε στο static ArrayList δεν πρόκειται να ξαναχρησιμοποιηθούν!
    Πρόβλημα θα υπήρχε αν γίνονταν τα controls dispose.

    Όσον αφορά το Collect, αυτό θυμίζει την παροιμία με το χυλό και το γιαούρτι.

    Τελικά, αν δεν σχολιαζόταν το γεγονός με τους event handlers, θα έλεγα ότι πρόκειται για ... διαφήμιση του ANTS Profiler!


    Βαγγέλης Λαμπρινίδης.
  •  06-10-2006, 13:48 18169 σε απάντηση της 18165

    Απ: Memory leaks σε managed κώδικα ???

    Either way παιδιά, ακόμη και το απλώς να διαβάσεις την ιστορία είναι αρκετό κατα τη γνώμη μου, εξ' ού και το post εδώ. Αν φταίει ή δε φταίει το framework είναι άσχετο κατα τη γνώμη μου. Το θέμα είναι απλώς οτι αν το δείς κάπου, θα το σκεφτείς μετά στον κώδικα σου :)
    Angel
    O:]
  •  06-10-2006, 13:55 18170 σε απάντηση της 18169

    Απ: Memory leaks σε managed κώδικα ???

    Ναι, σίγουρα. Το ηθικό δίδαγμα είναι ότι πάντοτε χρειάζεται προσοχή και συναίσθηση του τι κάνουμε...
    Vir prudens non contra ventum mingit
  •  06-10-2006, 13:57 18171 σε απάντηση της 18165

    Απ: Memory leaks σε managed κώδικα ???

    Να πω την αλήθεια, δεν βλέπω πουθενά να κατηγορεί ο αρθρογράφος το framework.

    Η ζωή χωρίς profiler μπορεί να αποδειχθεί μαρτύριο. Καλά με το managed κώδικα, μπορούμε να είμαστε λίγο τσαπατσούληδες και να αφήνουμε και κανένα reference που και που, ελπίζοντας ότι ο GC θα συμμαζέψει την κατάσταση. Για σκεφτείτε και το interop με COM components. Όπου πρέπει να καθαρίζουμε με το χέρι κάθε reference. Και οι wrappers δεν υποστηρίζουν IDisposable.......


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  06-10-2006, 14:05 18173 σε απάντηση της 18171

    Απ: Memory leaks σε managed κώδικα ???

    H ένστασή μου (όχι προς τον Anjelinio, προς θεού) είναι ως προς τον όρο "memory leak". Ας πούμε το circular reference στο COM ναι, είναι memory leak γιατί ό,τι και να κάνεις δεν μπορείς να το αποφύγεις. Αλλά αυτό που περιγράφεται στο blog είναι μια αναμενόμενη συμπεριφορά.

    Κατά τ'άλλα είναι χρησιμότατο το post ακριβώς για να υπενθυμίζει ότι πάντοτε χρειάζεται προσοχή - και αν θέλετε, καλή γνώση του συστήματος.
    Vir prudens non contra ventum mingit
  •  06-10-2006, 14:46 18179 σε απάντηση της 18169

    Απ: Memory leaks σε managed κώδικα ???

    Έχω την εντύπωση ότι ένας τίτλος "tracing memory leaks in .NET applications..." αν μη τι άλλο κατηγορεί τον GC. Με αυτόν τον τρόπο ίσως προσπαθεί να τραβήξει και την προσοχή.

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

    Όταν, τυχαίνει αυτά τα λάθη να τα κάνουν άλλοι, τότε, ακόμα καλύτερα!


    Βαγγέλης Λαμπρινίδης.
  •  06-10-2006, 16:03 18183 σε απάντηση της 18173

    Απ: Memory leaks σε managed κώδικα ???

     KelMan wrote:
    Ας πούμε το circular reference στο COM ναι, είναι memory leak γιατί ό,τι και να κάνεις δεν μπορείς να το αποφύγεις.

    Τι μου θύμισες τώρα! Σε μια VB6 εφαρμογή για να το αποφύγω αναγκαζόμουν να περνάω τον pointer του αντικειμένου και να το ξαναδημιουργώ! (Ναι, για όσους δεν το ξέρουν, η VB6 μπορεί να κάνει μια απλή διαχείριση pointers) Βέβαια ο κώδικας ήταν προσεκτικός γιατί αν στο μεταξύ το αντικείμενο είχε καταστραφεί και ο κώδικας πήγαινε να χρησιμοποιήσει τον pointer του... το πρόγραμμα εξαφανιζόταν από τα μάτια του χρήστη!

    Σίγουρα με τον garbage collector τα πράγματα είναι πιο απλά. Αυτό όμως δεν σημαίνει ότι με το COM reference counting δεν μπορούσες να κάνεις circular references ή ότι ο garbage collector είναι "καφετζού" και ελευθερώνει την μνήμη μαγικά! Άλλωστε και στο σπίτι μας, αν δεν βγάλουμε έξω τα σκουπίδια... τότε απλά δεν θα τα πάρει το συνεργείο καθαριότητας!


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  09-10-2006, 13:01 18290 σε απάντηση της 18169

    Απ: Memory leaks σε managed κώδικα ???

    για αυτό τό λόγο υπάρχει η using στην C# και τώρα υπάρχει και στην νέα vb

    ακόμα πέρα από τον ANTS Profiler υπάρχει και ο process Explorer που προσωπικά το έχω βρει αρκέτά εξυπηρετικό ειδικά όταν του βάλεις τις κολώνες για .ΝΕΤ

    θα το βρείτε στο http://www.sysinternals.com/Utilities/ProcessExplorer.html


    Antonios Chatzipavlis

  •  09-10-2006, 15:13 18302 σε απάντηση της 18290

    Απ: Memory leaks σε managed κώδικα ???

    Ακόμα και όταν χρησιμοποιείς using, θα υπάρχουν πάντα "καλικάτζαροι" που θα σου κάνουν τη ζωή δύσκολη. Το using είναι καλό όταν δεν σε ενδιαφέρει να επιζήσει η μεταβλητή έξω από το using block. Δεν σε βολεύει όμως όταν θέλεις να καθαρίσεις fields ή static μεταβλητές. Και οπωσδήποτε δεν βοηθάει όταν η μεταβλητή δεν υποστηρίζει το IDisposable. Όπως για παράδειγμα ... οι COM wrappers!

    Όσον αφορά τον Process Explorer, είναι ένα πολύ βολικό εργαλείο το οποίο θα σου πει ότι υπάρχει κάποιο πρόβλημα. Δεν θα σου πει όμως πού είναι το πρόβλημα. Θα σου πει πόσα αντικείμενα υπάρχουν στη μνήμη, δεν θα σου πει όμως σε ποιές κλάσεις ανήκουν για να μπορέσεις να τα εντοπίσεις.

    Όπως και να το δει κανείς, ένας καλός profiler σε γλυτώνει από πολλούς μπελάδες.

    Υ.Γ. Για όποιον θέλει ένα βασικό profiler υπάρχει και ο CLR Profiler 2.0 από τη Microsoft στο http://www.microsoft.com/downloads/thankyou.aspx?familyId=A362781C-3870-43BE-8926-862B40AA0CD0&displayLang=en. Μπορεί να μην έχει όλες τις δυνατότητες και ευκολίες του ANTS, είναι όμως τσάμπα και κάνει τη δουλειά.
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems