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

 

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

"Memory Leak"! Τι να κοιτάξω ώστε να βρώ τι φταίει?

Îåêßíçóå áðü ôï ìÝëïò pontifikas. Τελευταία δημοσίευση από το μέλος New Yorker στις 02-10-2007, 05:43. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  23-09-2007, 20:21 35292

    "Memory Leak"! Τι να κοιτάξω ώστε να βρώ τι φταίει?

    Αντιμετωπίζω πρόβλημα με μνημη που αυξάνει συνεχώς.
    Πώς το εννοώ:
    Έχω μια κλάση("Selected3DPointsCollections") που περιέχει 3 Collections.

    List<Selected3DPoints> Selected3DPointsList = new List<Selected3DPoints>();
    SortedDictionary<int, int> PointSpheresCollection = new SortedDictionary<int, int>(new IRBrain.IntegerKeyComparer());
    SortedList<Point, ArrayList> PointToSeedRelations = new SortedList<Point, ArrayList>(new IRBrain.PointComparer());


    Έχω ένα pubic static instance της κλάσης αυτής.
    Η "Selected3DPoints" είναι μια άλλη κλάση.
    Η PointToSeedRelations στο ArrayList αποθηκεύει Point.

    Για να βοηθήσω την διαίσθησή σας, έχω μια εικόνα(φωτογραφία).
    Όταν κάνω κλικ επάνω της, αποθηκεύω στην κλάση αυτή το pixel όπου έκανα click καθώς και τα γειτονικά του.
    Ένα αντικείμενο τύπου "Selected3DPoints" για κάθε pixel, μια 2άδα στην PointSpheresCollection και μια 2άδα στην PointToSeedRelations με το ArrayList να περιέχει
    τα γειτονικά points του pixel.
    Αν κάνω κλικ πατώντας Ctrl προθέτω το νέο Pixel στα Collections,αλλιώς καθαρίζω τα Collections της κλάσης και προσθέτω το νέο Pixel.(Με Ctrl δηλαδή φτοιάχων ομάδες από pixels)

    Όπως είπα, αν δεν πατώ Ctrl καθαρίζω τα Collections και αυτό το κάνω έτσι:

    for (int i = 0; i < Selected3DPointsList.Count; ++i)
    {
    Selected3DPointsList[ i ].Dispose();
    Selected3DPointsList[ i ] = null;
    }

    Selected3DPointsList.Clear();

    PointSpheresCollection.Clear();

    foreach (KeyValuePair<Point, ArrayList> pair in PointToSeedRelations)
    {
    pair.Value.Clear();
    }
    PointToSeedRelations.Clear();
    GC.Collect();

    Παρόλα αυτά παρατηρώ ότι κάθε φορά που κάνω click στην εικόνα η μνημη μου συνεχώς αυξάνει(δεν πατάω Ctrl).
    To πρόβλημα θα πρέπει να βρίσκεται στην κλάση που ανέφερα.

    Έχω δοκιμάσει ακόμα και να κάνω null το public static instance της και να την ξανάδημιουργήσω αλλά τίποτα.

    Τι μπορεί να φταίει?
    Επειδή γενικά χρησιμοποιώ πολλά Collections(Κυρίως Generics) υπάρχει κάτι συγκεκριμένο που πρέπει να κάνω για να απελευθερώσω τα αντικείμενα που περιέχουν ή ένα απλό Clear αρκεί?

    Ευχαριστώ.Smile


  •  23-09-2007, 23:51 35297 σε απάντηση της 35292

    Απ: "Memory Leak"! Τι να κοιτάξω ώστε να βρώ τι φταίει?

    Τη συμπεριφορά αυτή μπορείς να τη συναντήσεις ακόμα και αν δεν υπάρχει memory leak. Η μνήμη καθαρίζει μόνο όταν εκτελείται ο garbage collector, ο οποίος δεν εκτελείται αν δεν υπάρχει ανάγκη. Η διαγραφή των αντικειμένων κοστίζει σε CPU γι αυτό ο garbage collector εκτελείται όταν υπάρχει ανάγκη. Ίσα-ίσα, η κλήση του GC.Collect χωρίς να υπάρχει ανάγκη για μνήμη, θα καθυστερήσει την εφαρμογή σου.

    Δοκίμασα μία παραλλαγή του κώδικα σου και διαπίστωσα και εγώ ότι η μνήμη φαίνεται να αυξάνεται αργά όταν προσθέτω ένα-ένα τα σημεία. Όταν όμως άρχισα να τα προσθέτω κατά 50.000 τη φορά διαπίστωσα ότι μετά από κάθε Clear η μνήμη επανερχόταν στην αρχική κατάσταση. Προφανώς, η μνήμη επιστρέφεται στο λειτουργικό μόνο όταν ξεπεραστεί ένα αρκετά μεγάλο όριο.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  24-09-2007, 23:05 35356 σε απάντηση της 35297

    Απ: "Memory Leak"! Τι να κοιτάξω ώστε να βρώ τι φταίει?

    Παναγιώτη δοκίμασα και εγώ ένα loop με 1000 και δεν τις απελευθέρωσε. Μάλιστα μετά από μερικές επαναλήψεις άρχισε να κάνει dump στον σκληρό καθώς έφαγε όλη την μνήμη.
    Δεν μπορώ ρε γαμώτο να βρώ που το χάνω. Sad

    Σίγουρα όταν κάνω Clear ένα Collection γίνονται Dispose τα αντικείμενα που αυτό περιείχε?
  •  24-09-2007, 23:35 35359 σε απάντηση της 35356

    Απ: "Memory Leak"! Τι να κοιτάξω ώστε να βρώ τι φταίει?

    Αν κάνει dump τότε κάπου κρατάς references χωρίς να το ξέρεις. Το Clear δεν κάνει Dispose, απλά ελευθερώνει τα references που κρατάει η λίστα. Αν δεν υπάρχει άλλο reference στα αντικείμενα, η μνήμη των αντικειμένων θα ελευθερωθεί στο επόμενο garbage collection. Η μνήμη όμως δεν θα επιστραφεί αμέσως στο λειτουργικό, αλλά θα παραμείνει διαθέσιμη στην εφαρμογή για τη δημιουργία νέων αντικειμένων. Ένας άλλος λόγος που μπορεί να αυξάνεται η μνήμη είναι ότι ελευθερώνοντας πολλά αντικείμενα δημιουργείται fragmentation στη μνήμη. Ο garbage collector κάνει και defragmentation της μνήμης, αν κάποια όρια έχουν ξεπεραστεί.

    Δοκίμασε κάτι πιο απλό. Μία σκέτη φόρμα με τρία κουμπιά και ένα List<Point>. Το ένα κουμπί θα προσθέτει 50.000 points κάθε φορά, το άλλο θα καλεί απλά την Clear και το τρίτο την GC.Collect(). Τα 50.000 points πιάνουν μερικά MB τη φορά, οπότε όταν πατάς τo κουμπί Clear και μετά το Collect η μνήμη που ελευθερώνεται είναι μεγαλύτερη από οποιοδήποτε όριο και επιστρέφεται αμέσως στο λειτουργικό.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  29-09-2007, 10:53 35621 σε απάντηση της 35359

    Απ: "Memory Leak"! Τι να κοιτάξω ώστε να βρώ τι φταίει?

    Δεν μπορώ να το βρώ.
    Βασικά η εφαρμογή μου χρησιμοποιεί 3D γραφικά με Managed DirectX . Εκεί βρήκα 2 "τρύπες" αλλά εξακολουθεί να αυξάνει το μέγεθος σχεδόν με τον ίδιο
    ρυθμό(Λίγο μικρότερο).
    Ευχαριστω πάντως για την απάντηση.
  •  29-09-2007, 19:41 35631 σε απάντηση της 35621

    Απ: "Memory Leak"! Τι να κοιτάξω ώστε να βρώ τι φταίει?

    Μπορείς να κατεβάσεις trial από κάποιον profiler (πχ Ant Profiler) και να δεις τι έχει να σου πει... Ίσως σε γλυτώσει από τον πονοκέφαλο.


    Vir prudens non contra ventum mingit
  •  29-09-2007, 22:50 35632 σε απάντηση της 35631

    Απ: "Memory Leak"! Τι να κοιτάξω ώστε να βρώ τι φταίει?

    Να υποθέσω ότι θα κάνει και αυτός, ο οποίος είναι και free.
    Dimitris-Ilias Gkanatsios
    Developer Evangelist, Microsoft Hellas

    My Blog
    StudentGuru
    Twitter
    Facebook
  •  30-09-2007, 14:18 35655 σε απάντηση της 35632

    Απ: "Memory Leak"! Τι να κοιτάξω ώστε να βρώ τι φταίει?

    Και βέβαια κάνει. Ο Ant profiler όμως μπορεί να κρατήσεις snapshots "πριν" και "μετά" και να σου δείξει τις διαφορές. Μπορείς να κάνει το ίδιο και με τον CLR Profiler αλλά με πιο χειροκίνητο τρόπο. Αξίζει να τους δει κανείς και τους δύο, αν και νομίζω ότι με τον ANTS θα βρει τα πιθανά προβλήματα γρηγορότερα. Από εκεί και πέρα, αν μπορείς να πείσεις το αφεντικό να αγοράσει τον ANTS τέλεια. Αλλιώς, και ο CLR Profiler κάνει την δουλειά.

     


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  02-10-2007, 05:43 35721 σε απάντηση της 35655

    Απ: "Memory Leak"! Τι να κοιτάξω ώστε να βρώ τι φταίει?

    Δοκίμασες myobject.Dispose?

    New Yorker


    Στέφανος
    New Yorker
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems