Middle+
Μίλησε για τον συλλέκτη απορριμμάτων (garbage collector) στη γλώσσα Go.
sobes.tech AI
Απάντηση από AI
Το Go χρησιμοποιεί έναν παράλληλο, τριών χρωμάτων, μη συμπαγή συλλέκτη απορριμμάτων με χαμηλές καθυστερήσεις.
Βασικές αρχές λειτουργίας:
- Σήμανση (Mark): Καθορίζει ποια αντικείμενα είναι προσβάσιμα από τους ρίζες δείκτες (καταχωρητές, στοίβες goroutine, παγκόσμιες μεταβλητές). Χρησιμοποιεί έναν αλγόριθμο τριών χρωμάτων (λευκό - μη επισκεφθεί, γκρίζο - επισκεφθεί, αλλά οι απόγονοι δεν έχουν ελεγχθεί ακόμα, μαύρο - επισκεφθεί και όλοι οι απόγονοι έχουν ελεγχθεί).
- Καθάρισμα (Sweep): Διαγράφει αντικείμενα που δεν είναι προσβάσιμα (παραμένουν λευκά) και ελευθερώνει μνήμη για επαναχρησιμοποίηση.
Χαρακτηριστικά:
- Παράλληλο: Η σήμανση γίνεται παράλληλα με την εκτέλεση του κώδικα χρήστη (φάσεις STW - Stop-The-World - είναι πολύ σύντομες).
- Χαμηλές καθυστερήσεις: Σχεδιασμένο για ελαχιστοποίηση των διακοπών στην εκτέλεση της εφαρμογής.
- Μη συμπαγής: Δεν μετακινεί ζωντανούς αντικείμενα στη μνήμη, κάτι που μπορεί να οδηγήσει σε κατακερματισμό, αλλά απλοποιεί την υλοποίηση και επιταχύνει τη σήμανση/καθάρισμα.
Φάσεις εργασίας:
- Βοήθεια σήμανσης: Οι goroutine χρήστη βοηθούν τον συλλέκτη στη φάση σήμανσης κατά την κατανομή μνήμης.
- Σήμανση: Παράλληλη σήμανση των προσβάσιμων αντικειμένων.
- Ολοκλήρωση σήμανσης: Μια σύντομη φάση STW για την ολοκλήρωση της σήμανσης.
- Καθάρισμα: Παράλληλη διαγραφή των μη προσβάσιμων αντικειμένων.
Διαχείριση:
- Αυτόματα.
- Τα όρια ενεργοποίησης του GC ρυθμίζονται μέσω της μεταβλητής περιβάλλοντος
GOGC. Προεπιλεγμένα,GOGC=100, που σημαίνει ότι η συλλογή θα ξεκινήσει όταν το μέγεθος του σωρού διπλασιαστεί σε σχέση με τον προηγούμενο κύκλο συλλογής. - Η λειτουργία
runtime.GC()ξεκινά αναγκαστικά τη συλλογή απορριμμάτων, αλλά η χρήση της δεν συνιστάται στον τυπικό κώδικα.
package main
import (
"runtime"
"time"
)
func main() {
// Παράδειγμα αναγκαστικής κλήσης GC (σπάνια απαιτείται)
runtime.GC()
// Παράδειγμα ανάγνωσης στατιστικών GC
var memStats runtime.MemStats
runtime.ReadMemStats(&memStats)
// fmt.Printf("Συνολικά διατεθειμένη μνήμη: %v bytes\n", memStats.TotalAlloc)
}
Πλεονεκτήματα:
- Αυτόματη διαχείριση μνήμης, μειώνει την πιθανότητα σφαλμάτων (διαρροές μνήμης, διπλή απελευθέρωση).
- Σχεδιασμένο για παράλληλη εκτέλεση.
Μειονεκτήματα:
- Μη καθορισμένος χρόνος λειτουργίας GC.
- Πιθανή αύξηση της κατανάλωσης μνήμης σε σύγκριση με την χειροκίνητη διαχείριση.