Προγραμματισμός

Βέλτιστες πρακτικές για τη διευκόλυνση της συλλογής απορριμμάτων στο .Net

Στο Microsoft.Net, η συλλογή απορριμμάτων είναι ένας μηχανισμός που υιοθετήθηκε από το Common Language Runtime (CLR) για τον καθαρισμό των πόρων που καταναλώνει η εφαρμογή σας. Όταν δημιουργείτε αντικείμενα στο .Net, αποθηκεύονται στο σωρό που διαχειρίζεται. Ενώ πρέπει να δημιουργήσετε αντικείμενα, στις περισσότερες περιπτώσεις, δεν χρειάζεται να ανησυχείτε για τον καθαρισμό των αντικειμένων - ο χρόνος εκτέλεσης θα το έκανε για εσάς.

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

Πότε γίνεται η συλλογή απορριμμάτων;

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

Γενιές

Ο χρόνος εκτέλεσης οργανώνει τον διαχειριζόμενο σωρό σε γενιές. Χρησιμοποιεί αυτές τις γενιές για να οργανώσει βραχυπρόθεσμα και μακράς διάρκειας αντικείμενα. Πρέπει να σημειωθεί ότι ο συλλέκτης σκουπιδιών λειτουργεί πολύ πιο συχνά στις χαμηλότερες γενιές από ό, τι στις υψηλότερες. Το Generation 0 περιέχει τα βραχύβια αντικείμενα, όπως προσωρινά αντικείμενα. Όταν δημιουργείται ένα αντικείμενο, αποθηκεύεται στη Γενιά 0 εκτός και αν είναι μεγάλο αντικείμενο. Εάν το αντικείμενο είναι μεγάλο αντικείμενο, αποθηκεύεται στο Large Object Heap (LOH) στη Generation 2. Στις περισσότερες περιπτώσεις, τα αντικείμενα Generation 0 ανακτώνται από τον συλλέκτη απορριμάτων όταν εκτελείται στο παρασκήνιο.

Κατά τη σύνταξη κώδικα, θα πρέπει να τηρείτε ορισμένες βέλτιστες πρακτικές. Για παράδειγμα, θα πρέπει να δημιουργήσετε αντικείμενα στην τοπική εμβέλεια όσο το δυνατόν περισσότερο για να διευκολύνετε τη συλλογή απορριμμάτων. Τα αντικείμενα που δημιουργούνται στο υψηλότερο εύρος γενικά βρίσκονται στη μνήμη για μεγαλύτερο χρονικό διάστημα. Μπορείτε να εκμεταλλευτείτε το προφίλ προφίλ CLR για να κατανοήσετε τα μοτίβα κατανομής της εφαρμογής σας.

Θα πρέπει να αποφύγετε να καλέσετε το GC. Συλλογή () μέθοδος καθώς προκαλεί μια πλήρη συλλογή όλων των γενεών (Generation 0, 1 και 2). Όταν πραγματοποιείτε κλήση στο GC. Συλλογή () μέθοδος, ο χρόνος εκτέλεσης επισκέπτεται όλα τα ζωντανά αντικείμενα στην εφαρμογή σας. Αυτό απαιτεί πολύ χρόνο και, ως εκ τούτου, είναι μια πολύ ακριβή λειτουργία. Ως αποτέλεσμα, δεν είναι καλή πρακτική να καλέσετε το GC. Συλλογή () μέθοδος.

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

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

System.GC.Collect ();

System.GC.WaitForPendingFinalizers ();

System.GC.Collect ();

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

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

$config[zx-auto] not found$config[zx-overlay] not found