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

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

Πώς λειτουργεί η κατανομή μνήμης;

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

instagram viewer

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

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

Πώς λειτουργεί η κατανομή μνήμης;

Η εκχώρηση μνήμης είναι μια παρόμοια διαδικασία για όλες τις γλώσσες προγραμματισμού. Αλλά η αντίστοιχη μέθοδος κατανομής μνήμης τείνει να διαφέρει. Υπάρχουν δύο τύποι μεθόδων κατανομής μνήμης. χειροκίνητο και αυτόματο. Ένας GC κάνει αυτόματη κατανομή.

Διανομή μνήμης χωρίς απορριμματοσυλλέκτη

ο Γλώσσα προγραμματισμού C δεν χρησιμοποιεί GC για κατανομή μνήμης. Επομένως, οι προγραμματιστές C πρέπει να εκχωρούν και να εκχωρούν με μη αυτόματο τρόπο τη μνήμη. Το C επιτρέπει τη δυναμική εκχώρηση μνήμης όταν δεν γνωρίζετε, κατά το χρόνο μεταγλώττισης, πόση μνήμη θα χρησιμοποιήσετε κατά το χρόνο εκτέλεσης.

Η τυπική βιβλιοθήκη (stdlib.h) περιέχει τις συναρτήσεις που χρησιμοποιεί το C για τη διαχείριση της δυναμικής εκχώρησης μνήμης. Αυτές οι λειτουργίες περιλαμβάνουν:

  • malloc(): εκχωρεί ένα συγκεκριμένο μέγεθος μνήμης και επιστρέφει έναν δείκτη σε αυτή τη μνήμη. Εάν δεν υπάρχει επαρκής διαθέσιμη μνήμη στο χώρο αποθήκευσης μνήμης του λειτουργικού συστήματος, επιστρέφει μηδενική.
  • free(): εκχωρεί ένα συγκεκριμένο μπλοκ μνήμης και το επιστρέφει στο χώρο αποθήκευσης μνήμης του λειτουργικού συστήματος.

Παράδειγμα προγράμματος Γ

#περιλαμβάνω
#περιλαμβάνω

ενθκύριος()
{
ενθ *ptr; // δήλωση δείκτη
ενθ j; // δήλωση μετρητή

// εκχωρήστε χώρο για 200 ακέραιους αριθμούς
ptr = (ενθ *) malloc(200 * μέγεθος του(ενθ));

// εισάγετε ακέραιες τιμές στη μνήμη που έχει εκχωρηθεί
// και εκτυπώστε κάθε τιμή στην κονσόλα
Για (j = 0; j < 200; j++)
{
ptr[j] = j;
printf("%d\t",ptr[j]);
}

// καταχώρηση της μνήμης που είχε εκχωρηθεί προηγουμένως
Ελεύθερος(ptr);
ΕΠΙΣΤΡΟΦΗ0;
}

Ο παραπάνω κώδικας εκχωρεί μνήμη για την αποθήκευση 200 ακέραιων τιμών χρησιμοποιώντας το malloc() λειτουργία. Χρησιμοποιεί έναν δείκτη για πρόσβαση σε αυτή τη θέση μνήμης και αποθηκεύει 200 ​​ακέραιες τιμές σε αυτήν. Ο δείκτης εκτυπώνει επίσης τα δεδομένα που είναι αποθηκευμένα στη θέση μνήμης στην κονσόλα. Τέλος, το πρόγραμμα εκχωρεί τη μνήμη που είχε εκχωρηθεί προηγουμένως χρησιμοποιώντας το Ελεύθερος() λειτουργία.

Κατανομή μνήμης με έναν συλλέκτη σκουπιδιών

Πολλές δημοφιλείς γλώσσες προγραμματισμού χρησιμοποιούν GC για διαχείριση μνήμης. Αυτό κάνει τη ζωή των προγραμματιστών που χρησιμοποιούν αυτές τις γλώσσες πολύ πιο εύκολη. Η C# και η Java είναι δύο γλώσσες προγραμματισμού που χρησιμοποιούν GC.

Το C# GC

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

Το C# GC προετοιμάζει ένα χώρο συγκέντρωσης μνήμης, που ονομάζεται διαχειριζόμενος σωρός, για κάθε νέα διαδικασία (ή πρόγραμμα). Καλεί το VirtualAlloc() λειτουργία εκχώρησης μνήμης και το VirtualFree() λειτουργία για την κατανομή του. Το καλύτερο μέρος είναι ότι όλα αυτά συμβαίνουν στο παρασκήνιο χωρίς να απαιτείται προσπάθεια από εσάς, τον προγραμματιστή.

Το C# GC διαθέτει μια μηχανή βελτιστοποίησης, την οποία χρησιμοποιεί για να αποφασίσει πότε θα εκχωρήσει μνήμη. Η μηχανή βελτιστοποίησης εξετάζει τη ρίζα της εφαρμογής για να προσδιορίσει ποια αντικείμενα δεν χρησιμοποιούνται πλέον. Αυτό το κάνει δημιουργώντας ένα γράφημα που εκτείνεται από τη ρίζα της εφαρμογής έως τα συνδεδεμένα αντικείμενα. Αυτή η ρίζα περιλαμβάνει στατικά πεδία, τοπικές μεταβλητές κ.λπ. Οποιοδήποτε αντικείμενο δεν είναι συνδεδεμένο με τη ρίζα της εφαρμογής είναι σκουπίδια.

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

Το Java GC

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

  • Garbage-First (G1)
  • Κατα συρροη
  • Παράλληλο
  • Z Garbage Collector (ZGC)

Ο συλλέκτης απορριμμάτων G1 είναι ο προεπιλεγμένος GC της Java από την κυκλοφορία του Java Development Kit (JDK) 9. Η Java οργανώνει δεδομένα σε αντικείμενα και αποθηκεύει αυτά τα αντικείμενα σε ένα σωρό σταθερού μεγέθους. Ο συλλέκτης απορριμμάτων G1 χωρίζει το σωρό σε περιοχές σωρού ίσου μεγέθους. Στη συνέχεια, χώρισε αυτές τις περιοχές του σωρού σε δύο τμήματα. νέες και μεγάλες γενιές.

Κάθε φορά που δημιουργείτε ένα νέο αντικείμενο, η κατανομή χώρου για αυτό το αντικείμενο συμβαίνει στη νέα γενιά. Χρησιμοποιώντας μια διαδικασία γήρανσης, ο συλλέκτης απορριμμάτων G1 αντιγράφει αντικείμενα στις νεαρές περιοχές στις παλιές περιοχές. Αντιγράφει επίσης αντικείμενα που βρίσκονται ήδη στην παλιά περιοχή σε μια παλαιότερη περιοχή.

Στη συνέχεια, ο συλλέκτης απορριμμάτων G1 εκτελεί το μεγαλύτερο μέρος της κατανομής μνήμης στη νέα γενιά, περιστασιακά πηγαίνοντας στο τμήμα της παλιάς γενιάς.

Ποια είναι τα οφέλη από την ύπαρξη ενός σκουπιδοσυλλέκτη;

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

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

Η συλλογή σκουπιδιών μειώνει τα σφάλματα που σχετίζονται με τη διαχείριση της μνήμης, όπως διαρροές και σφάλματα δείκτη. Αυτό συμβαίνει επειδή η διαδικασία δεν εξαρτάται πλέον από τον προγραμματιστή και την ικανότητά του να γράφει ακριβή κώδικα.