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

 

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

Memory Leaks

Îåêßíçóå áðü ôï ìÝëïò BurnOut. Τελευταία δημοσίευση από το μέλος cap στις 17-06-2006, 16:59. Υπάρχουν 6 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  16-06-2006, 09:24 14059

    Lightning [li] Memory Leaks

    Χρησιμοποιώ .net 1.1 SP1. Παρατήρησα ότι η μνήμη  που δεσμεύουν οι φόρμες δεν αποδεσμεύεται όταν τις κλείνω. Συνήθως αυτό συμβαίνει όταν χρησιμοποιούνται umanaged resources αλλά το δοκίμασα σε απλές φόρμες και καθώς τις ανοιγοκλείνω o task manager δείχνει να δεσμεύει ολοένα και περισσότερη μνήμη. Το αποτέλεσμα είναι εφαρμογές (με φόρμες με πολλά controls tabpages σε tabpages κλπ που φορτώνουν «πολλά» δεδομένα από τον SQL Server) να  υποβαθμίζουν τόσο πολύ την διαθέσιμη μνήμη του συστήματος ώστε να χρειάζεται να γίνει επανεκκίνηση για να λειτουργήσει κάποιος ικανοποιητικά. Καμιά ιδέα??

  •  16-06-2006, 11:22 14061 σε απάντηση της 14059

    Απ: Memory Leaks

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

    Για παράδειγμα:

    Τις φόρμες τις εκχωρεις σε μεταβλητές ανοίγοντάς τις εσύ (π.χ. myForm=new Form1, myForm.Show());

    Οι φόρμες έχουν unmanaged στοιχεία μέσα; (Ειπες οτι έχουν, αλλά μηπως αυτά ευθύνονται για τα leaks μια και δεν γίνονται σωστά dispose);

    Διατηρείς δεδομένα σε singleton classes ή shared μεταβλητές;

    Εχεις δοκιμάσει να παίξεις απευθείας με τον Garbage Collector (CG) και να δεις τι γίνεται με τη διαθέσιμη μνήμη σου;

    Ισως αν μπορέσουμε να απαντησουμε στα παραπάνω να βρούμε κάποια άκρη.
    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  16-06-2006, 12:39 14070 σε απάντηση της 14059

    Απ: Memory Leaks

    Την φόρμα την ανοίγω με τον παρακάτω τρόπο

    Private Sub OnNew()

    Dim myForm As New MYForm

    myForm.Show()

    End Sub

    1.Στην φόρμα δεν χρησιμοποιώ unmanaged resources

    2.Αν φτιάξεις οποιαδήποτε φόρμα και βάλεις κάποια controls θα δεις στον task manager οτι ενώ την ανοιγοκλείνεις, η μνήμη συνεχώς αυξάνει.

    3. Τα μόνα δεδομένα που διατηρώ σε singleton κλάση είναι οι παράμετροι εφαρμογής ώστε απο όλες τις φόρμες να "βλέπω" το πώς έχει παραμετροποιήσει ο χρήστης την εφαρμογή και μια singleton κλάση η οποία που δίνει το connection

    4. Γενικά τα δεδομένα τα φορτώνω σε datasets, έχουν δηλωθεί ως πχ

    Friend WithEvents dsAddress As CustomControls.xsdAddressForCombo

    στην φόρμα που ανήκουν οπότε και λογικά καταστέφονται από τον gc οταν κλείσω την φόρμα και αυτός ενεργοποιηθεί
  •  16-06-2006, 15:01 14076 σε απάντηση της 14059

    Απ: Memory Leaks

    Σύμφωνα με τον κώδικα σου είναι πολύ λογικό να δεσμεύεται μνήμη κάθε φορά που ανοίγεις τη φόρμα. Αυτό συμβαίνει γιατί κάθε φορά δημιουργείς ΝΕΑ φόρμα, ενώ η παλιά δεν έχει γίνει προφανώς ακόμα dispose (αυτό θα το κάνει ο GC ... κάποτε).

    Αν θες να το αντιμετωπίσεις αυτό τότε θα πρέπει να χρησιμοποιήσεις singleton φόρμα, δηλαδή άπαξ και δημιουργήσεις μια φορά το αντικείμενο της φόρμας, να μην το ξαναδημιουργείς αλλά απλά να κάνεις Show.
    Στερνή μου γνώση να σε είχα πρώτα...
  •  17-06-2006, 12:48 14092 σε απάντηση της 14076

    Απ: Memory Leaks

    Κανοντας αυτό:

     

    Private WithEvents _myform As Form2
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            _myform = New Form2
            _myform.Show()
        End Sub

        Private Sub _myform_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles _myform.Closed
            _myform = Nothing
            GC.Collect()
        End Sub

     

    Δηλαδή μηδενίζοντας το reference στη Form2 (η "βαριά" μας φόρμα - εβαλα εκεί ενα datatable με 10000 rows) και αναγκάζοντας τον Garbage Collector να τη μαζέψει, βλέπω σχετική σταθερότητα στη μνήμη.

    Ομως, το αντίθετο δεν νοειται απαραίτητα ως memory leak. Απλά ο GC τρέχει όποτε θεωρεί εκεινος βέλτιστο, και ελευθερώνει κάποια μνήμη.

     


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  17-06-2006, 15:40 14096 σε απάντηση της 14059

    Απ: Memory Leaks

    Καλό θα ήτανε να αποφεύγουμε να καλούμε τον GC..Καλύτερα είναι να τα "μαζεύει" μόνος του οταν το θεωρεί αυτός.. Αν και ίσως σε περιπτώσεις όπως το παράδειγμα του Σωτήρη, να είναι καλό το manual call του.. (Ακριβώς επειδή η form έχει 10000 rows, και ξέρουμε ότι πρέπει να αδείασει..)
    Παναγιώτης Κεφαλίδης

    "Για να επιτύχεις, θα πρέπει το πάθος σου για την επιτυχία να είναι μεγαλύτερο απο τον φόβο σου για την αποτυχία"

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Παρακαλώ διαβάστε τους όρους χρήσης.
  •  17-06-2006, 16:59 14098 σε απάντηση της 14059

    Απ: Memory Leaks

    Σε extreme περιπτώσεις ίσως να είναι ορθό να φωνάξουμε εμείς τον GC. Αλλά γενικά φροντίζει καλύτερα από εμάς για εμάς. :)

    Να πω γενικά οτι αν δεν κάνουμε Nothing το reference τότε ο GC ενδέχεται να αργήσει αρκετά. Προσέξτε οτι εκχωρώ την "πάχιά" φόρμα σε private variable και την κάνω nothing στο closing της. Γενικά ακόμα και χωρίς να χρησιμοποιήσω το GC.Collect, θα έχω καλύτερη διαχείριση από απλά να την αφήσω στην τύχη της.


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

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