đ§ Golang āĻ Garbage Collector (GC) āĻā§āĻāĻžāĻŦā§ āĻāĻžāĻ āĻāϰ⧠â In-Depth āĻŦāĻžāĻāϞāĻž āĻŦā§āϝāĻžāĻā§āϝāĻž

A self-motivated and enthusiastic web developer with a deep interest in JavaScript (React.js). To work in the Software industry with modern web technologies of different local & multinational Software/ IT agencies of Bangladesh and grow rapidly with increasing responsibilities.
đ ā§§. āĻā§āĻŽāĻŋāĻāĻž
Go (āĻŦāĻž Golang) āĻāĻāĻāĻŋ compiled, concurrent āĻāĻŦāĻ garbage-collected programming language, āϝāĻž Google āϤā§āϰāĻŋ āĻāϰā§āĻā§āĨ¤
Go āĻāĻžāώāĻžāϰ āϏāĻŦāĻā§ā§ā§ āĻŦā§ āĻŦā§āĻļāĻŋāώā§āĻā§āϝāĻā§āϞā§āϰ āĻāĻāĻāĻŋ āĻšāϞ⧠āĻāϰ āĻĻā§āϰā§āϤ garbage collector (GC) â āϝāĻž āĻŦā§āϝāĻžāĻāĻā§āϰāĻžāĻāύā§āĻĄā§ āĻāϞāϤ⧠āĻĨāĻžāĻā§ āĻāĻŦāĻ āϏā§āĻŦā§āĻāĻā§āϰāĻŋā§āĻāĻžāĻŦā§ āĻ
āĻĒā§āϰā§ā§āĻāύā§ā§ āĻŽā§āĻŽāϰāĻŋ āĻŽā§āĻā§āϤ āĻāϰ⧠āĻĻā§ā§āĨ¤
āĻāĻāĻāύ Go āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻžāϰ āϝāĻāύ āĻā§āĻĄ āϞā§āĻā§, āϤāĻāύ āϤāĻžāĻā§ āĻŽā§āĻŽāϰāĻŋ āĻŽā§āϝāĻžāύā§āĻāĻŽā§āύā§āĻ āύāĻŋā§ā§ āĻāĻŋāύā§āϤāĻž āĻāϰāϤ⧠āĻšā§ āύāĻž â āϝā§āĻŽāύ C/C++ āĻ malloc() āĻŦāĻž free() āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻšā§āĨ¤
Go āĻāĻ āĻāĻžāĻāĻāĻž āĻāϰ⧠āĻĻā§ā§ āύāĻŋāĻā§āϰ runtime system āĻāϰ āĻā§āϤāϰ⧠āĻĨāĻžāĻāĻž garbage collector āĻĻāĻŋā§ā§āĨ¤
Garbage Collector-āĻāϰ āĻŽā§āϞ āĻāĻĻā§āĻĻā§āĻļā§āϝ āĻšāϞ⧠â
âāĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§ āϝā§āϏāĻŦ object āĻāϰ āĻĻāϰāĻāĻžāϰ āύā§āĻ, āϏā§āĻā§āϞā§āϰ āĻāύā§āϝ āĻŦāϰāĻžāĻĻā§āĻĻ āĻŽā§āĻŽāϰāĻŋ āĻŽā§āĻā§āϤ āĻāϰāĻžāĨ¤â
āĻāϤ⧠āĻāϰ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ memory leak, dangling pointer, āĻāĻŋāĻāĻŦāĻž out-of-memory crash āĻĨā§āĻā§ āĻŦāĻžāĻāĻā§āĨ¤
āϤāĻŦā§ Go GC āĻļā§āϧā§āĻŽāĻžāϤā§āϰ âāĻŽā§āĻŽāϰāĻŋ āĻĢā§āϰāĻŋâ āĻāϰ⧠āύāĻž â āĻāĻāĻŋ āĻāĻŽāύāĻāĻžāĻŦā§ āϤā§āϰāĻŋ āĻāϰāĻž āĻšā§ā§āĻā§ āϝā§āύ āĻ
āϤāĻŋ āĻāĻŽ pause time āύāĻŋā§ā§ āĻāĻžāĻ āĻāϰā§, āϝāĻžāϤ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ performance āύāώā§āĻ āύāĻž āĻšā§āĨ¤
āĻāĻāĻŋ Go āĻāĻžāώāĻžāĻā§ āĻāĻā§āĻ-āĻĒāĻžāϰāĻĢāϰāĻŽā§āϝāĻžāύā§āϏ āϏāĻžāϰā§āĻāĻžāϰ, āĻā§āϞāĻžāĻāĻĄ āĻ
ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ, āĻāĻŦāĻ concurrent āϏāĻŋāϏā§āĻā§āĻŽā§ āĻ
āϤā§āϝāύā§āϤ āĻāύāĻĒā§āϰāĻŋā§ āĻāϰā§āĻā§āĨ¤
đ§Š ā§¨. Garbage Collection āĻā§ āĻāĻŦāĻ āĻā§āύ āĻĻāϰāĻāĻžāϰ
āĻĒā§āϰāĻĨāĻŽā§ āĻŦā§āĻāĻž āĻĻāϰāĻāĻžāϰ â Garbage Collection āĻāϏāϞ⧠āĻā§?
đš Garbage Collection āĻāϰ āϧāĻžāϰāĻŖāĻž
Garbage Collection (GC) āĻšāϞ⧠āĻāĻŽāύ āĻāĻāĻāĻŋ āϏā§āĻŦāϝāĻŧāĻāĻā§āϰāĻŋāϝāĻŧ āĻŽā§āĻŽāϰāĻŋ āĻŽā§āϝāĻžāύā§āĻāĻŽā§āύā§āĻ āĻā§āĻāύāĻŋāĻ, āϝāĻž āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ runtime āĻāϞāĻžāϰ āϏāĻŽā§ āĻŦā§āϝāĻŦāĻšā§āϤ āĻŽā§āĻŽāϰāĻŋāϰ āĻāĻĒāϰ āύāĻāϰ āϰāĻžāĻā§ āĻāĻŦāĻ āϝāĻāύ āĻĻā§āĻā§ āĻā§āύ⧠āĻ āĻŦāĻā§āĻā§āĻ (object) āĻāϰ āĻŦā§āϝāĻŦāĻšā§āϤ āĻšāĻā§āĻā§ āύāĻž, āϤāĻāύ āϏā§āĻāĻŋāĻā§ āĻŽā§āĻŽāϰāĻŋ āĻĨā§āĻā§ āĻŽā§āĻā§ āĻĢā§āϞ⧠(free)āĨ¤
āĻ āϰā§āĻĨāĻžā§, GC āĻāĻŽāύ āϏāĻŦ āĻ āĻŦāĻā§āĻā§āĻ āĻā§āĻāĻā§ āĻŦā§āϰ āĻāϰ⧠āϝā§āĻā§āϞā§āϰ āϏāĻžāĻĨā§ āĻāϰ āĻā§āύ⧠āϰā§āĻĢāĻžāϰā§āύā§āϏ āύā§āĻāĨ¤
āĻāĻĻāĻžāĻšāϰāĻŖ:
func main() {
data := make([]int, 1000000)
data = nil // āĻāĻāύ data āĻā§āĻĨāĻžāĻ āϰā§āĻĢāĻžāϰā§āύā§āϏ āĻšāĻā§āĻā§ āύāĻž
}
āĻāĻāĻžāύ⧠data = nil āĻāϰāĻžāϰ āĻĒāϰ āϏā§āĻ slice āĻāϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻā§āĻĨāĻžāĻ āϰā§āĻĢāĻžāϰā§āύā§āϏ āĻšāĻā§āĻā§ āύāĻžāĨ¤
āϤāĻžāĻ Garbage Collector āĻŦā§āĻā§ āϝāĻžā§ â âāĻāĻ data āĻ
āĻĒā§āϰā§ā§āĻāύā§ā§â â āĻāĻŦāĻ āĻāĻŦāĻŋāώā§āϝāϤ⧠āĻā§āύ⧠āĻāĻ āϏāĻŽā§ āϏā§āĻāĻžāϰ āĻāύā§āϝ āĻŦāϰāĻžāĻĻā§āĻĻ āĻŽā§āĻŽāϰāĻŋ āĻĢā§āϰāĻŋ āĻāϰ⧠āĻĻā§ā§āĨ¤
đš āĻā§āύ āĻĻāϰāĻāĻžāϰ Garbage Collection
C āĻŦāĻž C++ āĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻžāϰāĻā§ āύāĻŋāĻ āĻšāĻžāϤ⧠āĻŽā§āĻŽāϰāĻŋ āĻĢā§āϰāĻŋ āĻāϰāϤ⧠āĻšā§:
int* arr = malloc(1000 * sizeof(int));
// āĻāĻžāĻ āĻļā§āώā§
free(arr);
āĻāĻ âāĻŽā§āϝāĻžāύā§āϝāĻŧāĻžāϞâ āĻŽā§āĻŽāϰāĻŋ āĻŽā§āϝāĻžāύā§āĻāĻŽā§āύā§āĻā§āϰ āϏāĻŽāϏā§āϝāĻž āĻšāϞā§:
āĻā§āϞ⧠āĻŽā§āĻŽāϰāĻŋ āĻĢā§āϰāĻŋ āύāĻž āĻāϰāϞ⧠āĻšā§ Memory Leak
āĻā§āϞ āĻāĻžā§āĻāĻžā§ āĻĢā§āϰāĻŋ āĻāϰāϞ⧠āĻšā§ Dangling Pointer
āĻŦāĻžāϰāĻŦāĻžāϰ allocate/free āĻāϰāϞ⧠fragmentation āĻŦāĻžā§ā§
āĻŦā§ concurrent āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§ āĻā§āϰā§āϝāĻžāĻ āϰāĻžāĻāĻž āĻā§āĻŦ āĻāĻ āĻŋāύ āĻšā§ā§ āϝāĻžā§
Go āĻāĻ āϏāĻŽāϏā§āϝāĻžāĻā§āϞ⧠āϏāĻŽāĻžāϧāĻžāύ āĻāϰ⧠āϤāĻžāϰ Automatic Garbage Collector āĻĻāĻŋā§ā§āĨ¤
đš Go āĻāϰ Garbage Collector-āĻāϰ āĻŽā§āϞ āϞāĻā§āώā§āϝ
Go GC āϤā§āϰāĻŋ āĻāϰāĻž āĻšā§ā§āĻāĻŋāϞ āϤāĻŋāύāĻāĻŋ āĻŽā§āϞ āĻāĻĻā§āĻĻā§āĻļā§āϝ āύāĻŋā§ā§:
Concurrent performance āĻŦāĻāĻžā§ āϰāĻžāĻāĻž â
āϝā§āύ Garbage Collection āĻāϞāĻžāϰ āϏāĻŽā§ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻĒā§āϰā§āĻĒā§āϰāĻŋ āĻŦāύā§āϧ āύāĻž āĻšā§āĨ¤Low latency / Small pause time â
Go āĻāĻŋāĻŽā§āϰ āϞāĻā§āώā§āϝ: âkeep GC pause under 100 microseconds for typical workloadsāĨ¤âSimple to use for developers â
āĻĄā§āĻā§āϞāĻĒāĻžāϰāϰāĻž āϝā§āύ āĻŽā§āĻŽāϰāĻŋ āύāĻŋā§ā§ āĻāĻŋāύā§āϤāĻž āύāĻž āĻāϰ⧠āĻŦā§āϝāĻŦāϏāĻžā§āĻŋāĻ āϞāĻāĻŋāĻā§āĻ āĻŽāύ āĻĻāĻŋāϤ⧠āĻĒāĻžāϰā§āĨ¤
âī¸ ā§Š. Go āĻāĻžāώāĻžāϰ āĻŽā§āĻŽāϰāĻŋ āĻŽāĻĄā§āϞ (Memory Model)
Go āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§ āĻĻā§āĻ āĻāĻžā§āĻāĻžā§ āĻŽā§āĻŽāϰāĻŋ āĻŦāϰāĻžāĻĻā§āĻĻ āĻšā§:
Stack Memory
Heap Memory
đ§Ž Stack Memory
āĻĒā§āϰāϤāĻŋāĻāĻŋ goroutine-āĻāϰ āĻāύā§āϝ āĻāϞāĻžāĻĻāĻž stack āĻĨāĻžāĻā§āĨ¤
Local variable, function parameter āĻāϤā§āϝāĻžāĻĻāĻŋ stack āĻ āĻĨāĻžāĻā§āĨ¤
Function āĻļā§āώ āĻšāϞ⧠stack memory āϏā§āĻŦāϝāĻŧāĻāĻā§āϰāĻŋāϝāĻŧāĻāĻžāĻŦā§ āĻŽā§āĻā§āϤ āĻšā§āĨ¤
Stack āĻā§āĻŦ āĻĻā§āϰā§āϤ allocate/free āĻāϰāĻž āϝāĻžā§āĨ¤
GC āϏāĻžāϧāĻžāϰāĻŖāϤ stack-āĻāϰ āĻāĻĒāϰ āĻāĻžāĻ āĻāϰ⧠āύāĻž (āϝā§āĻšā§āϤ⧠āĻāĻāĻŋ āύāĻŋāĻā§āĻ lifecycle āĻāĻŋāϤā§āϤāĻŋāĻ)āĨ¤
đ§ą Heap Memory
āϝāĻāύ āĻĄā§āĻāĻž function āĻāϰ āĻŦāĻžāĻāϰ⧠āĻŦāĻžāĻāĻā§ (escape āĻšā§), āϤāĻāύ āϤāĻž heap āĻ āĻŦāϰāĻžāĻĻā§āĻĻ āĻšā§āĨ¤
Heap memory-āϰ āĻāĻĒāϰā§āĻ GC āĻāĻžāĻ āĻāϰā§āĨ¤
Heap āĻĨā§āĻā§ allocate āĻāϰāĻž object āĻā§āϞ⧠reference āĻĻā§āĻŦāĻžāϰāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻšā§āĨ¤
GC heap āϏā§āĻā§āϝāĻžāύ āĻāϰ⧠āĻĻā§āĻā§ āĻā§āύ object āĻāĻāύ⧠reachable, āĻā§āύāĻāĻž āύā§āĨ¤
āĻāĻĻāĻžāĻšāϰāĻŖ:
func makeSlice() *[]int {
s := make([]int, 10) // heap allocation
return &s
}
āĻāĻāĻžāύ⧠slice āĻāĻŋ function āĻļā§āώ āĻšāĻā§āĻžāϰ āĻĒāϰā§āĻ āĻŦā§āĻāĻā§ āĻĨāĻžāĻā§, āĻāĻžāϰāĻŖ āϤāĻžāϰ address return āĻšāĻā§āĻā§āĨ¤ āϤāĻžāĻ āĻāĻāĻž heap-āĻ āϤā§āϰāĻŋ āĻšā§ āĻāĻŦāĻ GC āĻāϰ āύāĻāϰāĻĻāĻžāϰāĻŋāϤ⧠āĻāϏā§āĨ¤
đ ā§Ē. Go GC-āĻāϰ āĻŦāĻŋāĻŦāϰā§āϤāύ (Evolution of Go Garbage Collector)
Go-āĻāϰ GC āĻĒā§āϰāĻĨāĻŽ āĻĨā§āĻā§ āĻ āύā§āĻ āĻĒāϰāĻŋāĻŦāϰā§āϤāύā§āϰ āĻŽāϧā§āϝ āĻĻāĻŋā§ā§ āĻā§āĻā§āĨ¤ āύāĻŋāĻā§ āĻāϰ āĻāϤāĻŋāĻšāĻžāϏ āϏāĻāĻā§āώā§āĻĒā§ āĻĻā§āĻāĻž āϝāĻžāĻ đ
| Go Version | GC Model | āĻŦā§āĻļāĻŋāώā§āĻā§āϝ |
| Go 1.0 (2012) | Stop-the-world Mark and Sweep | āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻŦāύā§āϧ āĻāϰ⧠GC āĻšāϤ⧠|
| Go 1.3 | Concurrent mark | Marking concurrent āĻšāϞā§, āĻāĻŋāύā§āϤ⧠sweeping āϤāĻāύ⧠stop-the-world āĻāĻŋāϞ |
| Go 1.5 | Fully concurrent Mark-and-Sweep | âStop-the-worldâ āϏāĻŽā§ 10ms â < 1ms |
| Go 1.8 | Hybrid concurrent GC | Incremental mark and sweep, āĻāϰāĻ āĻāĻŽ pause |
| Go 1.12+ | Optimized Pacing | GC āύāĻŋāĻā§āĻ adaptive āĻšā§ā§ āϝāĻžā§ workload āĻ āύā§āϝāĻžā§ā§ |
| Go 1.19+ | Reduced STW time | Pause time āĻāĻŽāĻŋā§ā§ āĻāύāĻž āĻšā§ āĻā§ā§āĻ microsecond āĻ |
| Go 1.22 | Generational GC experiments | Future plan: young-old generation separation |
āĻāĻāύāĻāĻžāϰ Go GC (āϝā§āĻŽāύ Go 1.22) āĻāĻāĻĻāĻŽ state-of-the-art concurrent, non-compacting, tri-color mark-sweep collector, āϝāĻž server workload āĻāϰ āĻāύā§āϝ tunedāĨ¤
đ¯ ā§Ģ. Go GC āĻāϰ āĻŽā§āϞ āϧāĻžāϰāĻŖāĻž â Mark and Sweep Algorithm
Go GC āĻŽā§āϞāϤ Mark and Sweep āϧāĻžāϰāĻŖāĻžāϰ āĻāĻĒāϰ āϤā§āϰāĻŋāĨ¤
āĻāϞā§āύ āϏāĻšāĻāĻāĻžāĻŦā§ āĻĻā§āĻāĻŋ āĻā§ āĻšā§āĨ¤
Step 1: Mark Phase
GC āĻĻā§āĻā§ āĻā§āύ āĻā§āύ object âreachableâ â āĻ āϰā§āĻĨāĻžā§ āĻāĻāύ⧠āĻā§āύ⧠āĻā§āϝāĻžāϰāĻŋā§ā§āĻŦāϞ āĻŦāĻž data structure āĻĨā§āĻā§ āϰā§āĻĢāĻžāϰā§āύā§āϏ āĻāϰāĻž āĻāĻā§āĨ¤
āϝā§āĻā§āϞ⧠āĻĒāĻžāĻā§āĻž āϝāĻžā§, āϏā§āĻā§āϞā§āĻā§ âmarkedâ āĻāϰāĻž āĻšā§āĨ¤
Step 2: Sweep Phase
āĻāϰāĻĒāϰ GC āϏāĻŽāϏā§āϤ heap āϏā§āĻā§āϝāĻžāύ āĻāϰ⧠āĻĻā§āĻā§ āĻā§āύ object unmarked â āĻŽāĻžāύā§, unreachableāĨ¤
āĻāĻā§āϞā§āĻā§ free āĻāϰ⧠āĻŽā§āĻŽāϰāĻŋ āϰāĻŋāĻā§āϞā§āĻāĻŽ āĻāϰāĻž āĻšā§āĨ¤
āĻāĻĻāĻžāĻšāϰāĻŖ:
root (main) ââ> A ââ> B
âââ> C
āϝāĻĻāĻŋ C āĻĨā§āĻā§ D āϤ⧠āĻā§āύ⧠āϰā§āĻĢāĻžāϰā§āύā§āϏ āĻĨāĻžāĻā§, āĻāϰ āĻĒāϰ⧠C = nil āĻāϰ⧠āĻĻā§āĻā§āĻž āĻšā§, āϤāĻžāĻšāϞ⧠D āĻāϰ āĻāĻžāϰ⧠āĻĻā§āĻŦāĻžāϰāĻž āϰā§āĻĢāĻžāϰā§āύā§āϏ āĻšāĻā§āĻā§ āύāĻž â GC D āĻā§ sweep āĻāϰ⧠āĻĻā§āĻŦā§āĨ¤
đ¨ ā§Ŧ. Tri-Color Marking Algorithm
Go GC āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠Tri-color marking āύāĻžāĻŽā§āϰ āĻāĻāĻāĻŋ āĻāύā§āύāϤ āĻĒāĻĻā§āϧāϤāĻŋāĨ¤
āĻĒā§āϰāϤā§āϝā§āĻ object āϤāĻŋāύāĻāĻŋ āϰāĻā§āϰ āĻŽāϧā§āϝ⧠āĻāĻāĻāĻŋāϤ⧠āĻĨāĻžāĻā§:
White â Unreachable (potential garbage)
Gray â Discovered but not fully processed
Black â Fully reachable (live object)
āĻāĻžāĻā§āϰ āϧāĻžāĻĒ:
āĻĒā§āϰāĻĨāĻŽā§ āϏāĻŦ object white āĻĨāĻžāĻā§āĨ¤
Root (āϝā§āĻŽāύ global vars, stack refs) āĻĨā§āĻā§ reachable object āĻā§āϞ⧠gray āĻāϰāĻž āĻšā§āĨ¤
GC gray object āĻĨā§āĻā§ āĻāϰ āϰā§āĻĢāĻžāϰā§āύā§āϏ āĻā§āϞ⧠traverse āĻāϰ⧠â āϏā§āĻā§āϞ⧠gray āĻšā§, āĻāϰ āĻŦāϰā§āϤāĻŽāĻžāύāĻāĻŋ black āĻšā§ā§ āϝāĻžā§āĨ¤
āĻļā§āώāĻŽā§āĻļ āϝā§āĻā§āϞ⧠white āĻĨā§āĻā§ āϝāĻžā§, āϏā§āĻā§āϞ⧠āĻĢā§āϰāĻŋ āĻāϰ⧠āĻĻā§āĻā§āĻž āĻšā§āĨ¤
āĻāĻāĻžāĻŦā§ GC āϧā§āϰ⧠āϧā§āϰ⧠āĻĒā§āϰ⧠heap traverse āĻāϰā§, concurrent āĻāĻžāĻŦā§āĨ¤
âĄī¸ ā§. Concurrent āĻāĻŦāĻ Parallel Collection
Go-āĻāϰ GC concurrent, āĻŽāĻžāύ⧠Garbage Collection āĻāϞāĻžāϰ āϏāĻŽā§āĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ (goroutines) āĻāϞāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻ āϧāĻžāϰāĻŖāĻž āĻāϏā§āĻā§ real-time, low-latency systems āĻĨā§āĻā§, āϝā§āĻāĻžāύ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻĨāĻžāĻŽāĻžāύ⧠āĻā§āĻŦ āĻŦā§āϝā§āĻŦāĻšā§āϞāĨ¤
đš Stop-the-World (STW) āĻā§?
āĻĒā§āϰāύ⧠GC āĻā§āϞā§āϰ (āϝā§āĻŽāύ Java āĻāϰ āĻĒā§āϰāύ⧠JVM āĻŦāĻž Go 1.0) āĻāĻāĻāĻŋ āĻŦā§ āϏāĻŽāϏā§āϝāĻž āĻāĻŋāϞ â
âStop-the-Worldâ phase â āĻ āϰā§āĻĨāĻžā§ āĻĒā§āϰ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻŋāĻā§āĻā§āώāĻŖā§āϰ āĻāύā§āϝ āĻŦāύā§āϧ āĻšā§ā§ āϝā§āϤāĨ¤
āĻāĻ āϏāĻŽā§āĻāĻžāϤ⧠GC heap āϏā§āĻā§āϝāĻžāύ āĻāϰ⧠āĻŽāĻžāϰā§āĻāĻŋāĻ āĻŦāĻž sweeping āĻāϰāϤāĨ¤
āĻāĻŋāύā§āϤ⧠Go āĻāĻŋāĻŽ āϞāĻā§āώā§āϝ āĻāϰāϞ: āĻā§ā§āĻŦ āϏāĻžāϰā§āĻāĻžāϰ⧠āϝāĻĻāĻŋ āĻĒā§āϰāϤāĻŋ āϏā§āĻā§āύā§āĻĄā§ āĻļāϤ āĻļāϤ āϰāĻŋāĻā§ā§ā§āϏā§āĻ āĻāϏā§, āĻāϰ GC āĻāϰ āĻāύā§āϝ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ ā§§ā§Ļâ⧍ā§Ļms āĻŦāύā§āϧ āĻĨāĻžāĻā§, āϤāĻžāĻšāϞ⧠latency āĻ
āύā§āĻ āĻŦāĻžā§ā§āĨ¤
đš Go āĻā§āĻāĻžāĻŦā§ āĻāĻ āϏāĻŽāϏā§āϝāĻž āϏāĻŽāĻžāϧāĻžāύ āĻāϰā§āĻā§?
Go 1.5 āĻĨā§āĻā§ GC āĻšā§ā§ āĻā§āĻā§ Concurrent Mark and SweepāĨ¤
āĻāϤ⧠āĻāϰ⧠âStop-the-worldâ āϏāĻŽā§ āĻŽāĻžāϤā§āϰ āĻā§ā§āĻ āĻŽāĻžāĻāĻā§āϰā§āϏā§āĻā§āύā§āĻĄā§ āύā§āĻŽā§ āĻāϏā§āĻā§āĨ¤
āĻāĻāύ GC āĻāĻŦāĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ goroutines āĻāĻāϏāĻžāĻĨā§ parallel āĻāϞ⧠â
āĻ
āϰā§āĻĨāĻžā§, GC mark phase āĻāϞāĻžāϰ āϏāĻŽā§āĻ goroutine āĻā§āϞ⧠request serve āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤
đ§Ž ā§Ž. Write Barrier āĻāĻŦāĻ Memory Barrier
GC concurrent āĻāϰāĻžāϰ āϏāĻŽā§ āĻāĻāĻāĻž āϏāĻŽāϏā§āϝāĻž āĻšā§ â
āϝāĻāύ GC marking āĻāϰāĻā§, āϤāĻāύ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϝāĻĻāĻŋ āĻā§āύ⧠object āĻāϰ reference āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰā§?
āϝā§āĻŽāύ, āĻā§āύ⧠āĻā§āϝāĻžāϰāĻŋā§ā§āĻŦāϞ nil āĻāϰ⧠āĻĻā§ā§, āĻŦāĻž āύāϤā§āύ reference assign āĻāϰā§āĨ¤
āϤāĻāύ GC āĻā§āĻāĻžāĻŦā§ āĻŦā§āĻāĻŦā§ āĻā§āύ object āĻāĻāύ⧠âreachableâ āĻāϰ āĻā§āύāĻāĻž āύā§?
āĻāĻāĻžāύā§āĻ āĻāϏ⧠Write BarrierāĨ¤
đš Write Barrier āĻā§?
Write Barrier āĻšāϞ⧠āĻāĻŽāύ āĻāĻāĻāĻž āĻā§āĻ āĻā§āĻĄ āϏā§āύāĻŋāĻĒā§āĻ, āϝāĻž āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ memory write (assignment) āĻāϰāĻžāϰ āϏāĻŽā§ āĻāĻžāϞāĻžāύ⧠āĻšā§āĨ¤
āĻāĻāĻŋ GC āĻā§ āĻāĻžāύāĻžā§: âāĻāĻ reference āĻŦāĻĻāϞā§āĻā§, āĻāĻ object āĻā§ āύāϤā§āύ āĻāϰ⧠mark āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤â
āĻāĻāĻž āϏāĻžāϧāĻžāϰāĻŖāϤ runtime āĻĻā§āĻŦāĻžāϰāĻž āĻ āĻā§ āĻāύāĻā§āĻā§āĻā§āĻĄ āĻšā§āĨ¤
āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ:
ptr.field = newValue
āĻāĻ āϞāĻžāĻāύ āĻāϞāĻžāϰ āϏāĻŽā§ write barrier GC āĻā§ āĻāĻžāύāĻžā§ āϝ⧠ptr āĻāĻŦāĻ newValue āĻāϰ reference āϏāĻŽā§āĻĒāϰā§āĻ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻšā§ā§āĻā§āĨ¤
đš āĻā§āύ āĻĻāϰāĻāĻžāϰ?
āĻāĻāĻŋ āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰ⧠āϝ⧠concurrent GC marking phase āĻ āĻā§āύ⧠reachable object āĻā§āϞ⧠āĻĢā§āϰāĻŋ āύāĻž āĻšā§ā§ āϝāĻžā§āĨ¤
đš Memory Barrier
āĻāĻāĻŋ CPU-āĻā§ āĻŦāϞ⧠āĻĻā§ā§ āĻā§āύ read/write operation reorder āĻāϰāĻž āϝāĻžāĻŦā§ āύāĻž â
āϝāĻžāϤ⧠GC consistent view āĻĒāĻžā§āĨ¤
đ§ ⧝. Stack Scanning āĻāĻŦāĻ Root Set
Go GC marking āĻļā§āϰ⧠āĻāϰ⧠āĻāĻāĻāĻŋ root set āĻĨā§āĻā§āĨ¤
đš Root Set āĻā§?
Global variables
Goroutine stacks (local references)
CPU registers
āĻāĻ root āĻā§āϞā§āϰ āĻŽāϧā§āϝ āĻĻāĻŋā§ā§ GC āĻāĻžāύ⧠āĻā§āύ object āĻĨā§āĻā§ traversal āĻļā§āϰ⧠āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤
đš Stack Scanning
āĻĒā§āϰāϤā§āϝā§āĻ goroutine-āĻāϰ stack āϏā§āĻā§āϝāĻžāύ āĻāϰāĻž āĻšā§ â stack frame āĻĨā§āĻā§ local references āϏāĻāĻā§āϰāĻš āĻāϰāĻž āĻšā§āĨ¤
āϝā§āĻā§āϞ⧠heap object āĻā§ point āĻāϰā§, āϏā§āĻā§āϞ⧠GC-āϰ entry point āĻšā§ā§ āϝāĻžā§āĨ¤
Stack āϏā§āĻā§āϝāĻžāύ āϏāĻžāϧāĻžāϰāĻŖāϤ concurrent āĻāĻžāĻŦā§ āĻšā§, āĻāĻŋāύā§āϤ⧠āĻāĻŋāĻā§ āϏāĻŽā§ā§āϰ āĻāύā§āϝ stop-the-world āĻĻāϰāĻāĻžāϰ āĻšā§ coordination āĻāϰ āĻāύā§āϝāĨ¤
đ§ą ā§§ā§Ļ. Heap Organization āĻāĻŦāĻ Object Allocation
Go-āĻāϰ heap āĻā§ āĻ
āύā§āĻāĻā§āϞ⧠span āĻ āĻāĻžāĻ āĻāϰāĻž āĻšā§āĨ¤
āĻĒā§āϰāϤāĻŋāĻāĻŋ span āĻšāϞ⧠āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāĻāĻžāϰā§āϰ (class size) memory blockāĨ¤
| Span Size Class | Object Size (bytes) | Objects per span |
| 8 bytes | 8 | 512 |
| 16 bytes | 16 | 256 |
| 32 bytes | 32 | 128 |
Go runtime āĻāĻāĻāĻŋ mcache āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻĒā§āϰāϤāĻŋ P (processor) āĻāϰ āĻāύā§āϝ āϞā§āĻāĻžāϞ cache āϰāĻžāĻā§āĨ¤
āϝāĻžāϤ⧠āĻā§āĻ object allocation āĻā§āĻŦ āĻĻā§āϰā§āϤ āĻšā§ (lock-free)āĨ¤
āϝāĻāύ āĻā§āύ⧠span āĻĢāĻžāĻāĻāĻž āĻšā§ā§ āϝāĻžā§ (āϏāĻŦ object free), āϤāĻāύ āϏā§āĻāĻŋ GC āĻĻā§āĻŦāĻžāϰāĻž āĻĒā§āύāϰāĻžā§ āĻŦā§āϝāĻŦāĻšāĻžāϰā§āϰ āĻāύā§āϝ āĻĢā§āϰāϤ āĻĻā§āĻā§āĻž āĻšā§āĨ¤
đ ā§§ā§§. Stop-the-world āĻāĻŦāĻ Minimization Techniques
āϝāĻĻāĻŋāĻ Go-āĻāϰ GC concurrent, āϤāĻžāϰāĻĒāϰāĻ āĻāĻŋāĻā§ āĻāĻžā§āĻāĻžā§ STW āĻ āĻĒāϰāĻŋāĻšāĻžāϰā§āϝ:
Root discovery (start of marking)
Mark termination (end of mark phase)
Some heap sweeping synchronizations
đš Pause Time Optimization Techniques
Go GC pause āĻāĻŽāĻžāύā§āϰ āĻāύā§āϝ āĻā§ā§āĻāĻāĻŋ āĻā§āĻļāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§:
Incremental marking
Parallel sweeping
Work stealing between Pâs
Adaptive pacing (GC frequency workload āĻ āύā§āϝāĻžā§ā§ adjust āĻšā§)
Go 1.19 āĻāϰ āĻĒāϰ āĻĨā§āĻā§ typical pause time āĻĨāĻžāĻā§ under 50 microseconds â āϝāĻž real-time workload-āĻāϰ āĻāύā§āϝ āĻāĻĒāϝā§āĻā§āϤāĨ¤
âī¸ ā§§ā§¨. GOGC āĻāĻŦāĻ Tuning Parameters
đš GOGC āĻā§?
GOGC āĻšāϞ⧠environment variable, āϝāĻž āĻŦāϞ⧠āĻĻā§ā§ āĻāϤ āĻļāϤāĻžāĻāĻļ heap āĻŦā§āĻĻā§āϧāĻŋ āĻšāϞ⧠GC āĻāĻžāϞ⧠āĻšāĻŦā§āĨ¤
āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ:
GOGC=100 # Default
āĻŽāĻžāύ⧠heap āĻāĻā§āϰ āϏāĻžāĻāĻ āĻĨā§āĻā§ 100% āĻŦā§ āĻšāϞ⧠GC āĻā§āϰāĻŋāĻāĻžāϰ āĻšāĻŦā§āĨ¤
āϝāĻĻāĻŋ āϤā§āĻŽāĻŋ āϏā§āĻ āĻāϰā§:
GOGC=50
āϤāĻžāĻšāϞ⧠heap ā§Ģā§Ļ% āĻŦā§ āĻšāϞā§āĻ GC āĻāĻžāϞ⧠āĻšāĻŦā§ (āĻŦā§āĻļāĻŋ āĻĢā§āϰāĻŋāĻā§ā§ā§āύā§āĻ, āĻāĻŋāύā§āϤ⧠āĻāĻŽ āĻŽā§āĻŽāϰāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ)āĨ¤
āĻāĻŦāĻžāϰ
GOGC=200
āĻŽāĻžāύ⧠heap ⧍ā§Ļā§Ļ% āĻŦāĻžā§āϞ⧠GC āĻāϞāĻŦā§ (āĻāĻŽ āĻĢā§āϰāĻŋāĻā§ā§ā§āύā§āĻ, āĻāĻŋāύā§āϤ⧠āĻŦā§āĻļāĻŋ āĻŽā§āĻŽāϰāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ)āĨ¤
đš Dynamic Control
Go 1.19 āĻĨā§āĻā§ runtime āĻāϰ āĻŽāϧā§āϝā§āĻ debug.SetGCPercent() āĻĻāĻŋā§ā§ āϏā§āĻ āĻāϰāĻž āϝāĻžā§:
import "runtime/debug"
debug.SetGCPercent(200)
đ ā§§ā§Š. Performance Optimization
GC performance āύāĻŋāϰā§āĻāϰ āĻāϰ⧠āĻā§ā§āĻāĻāĻŋ āĻŦāĻŋāώā§ā§āϰ āĻāĻĒāϰ:
Allocation Rate:
āϝāϤ āĻŦā§āĻļāĻŋ āĻ āĻŦāĻā§āĻā§āĻ āϤā§āϰāĻŋ āĻšāĻŦā§, GC āϤāϤ āĻāύ āĻāύ āĻāϞāĻŦā§āĨ¤Object Lifetime:
āĻā§āĻ-lived object āĻā§āϞ⧠heap āĻ āĻŦā§āĻļāĻŋ āϤā§āϰāĻŋ āĻšāϞ⧠overhead āĻŦāĻžā§ā§āĨ¤Pointer Density:
Pointer āϝāϤ āĻāĻŽ, GC marking āϤāϤ āĻĻā§āϰā§āϤ āĻšā§āĨ¤Memory Fragmentation:
GC sweeping āĻŽā§āĻŽāϰāĻŋ āϰāĻŋāĻā§āϞā§āĻāĻŽ āĻāϰāϞā§āĻ āϝāĻĻāĻŋ fragment āĻšā§, performance āĻāĻŽā§ āϝāĻžā§āĨ¤
â Optimization Tips
Short-lived object āĻā§āϞ⧠stack āĻ āϰāĻžāĻā§ (escape analysis āĻ āϏāĻžāĻšāĻžāϝā§āϝ āĻāϰā§)āĨ¤
Sync.Pool āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠reusable objects āĻāϰ āĻāύā§āϝāĨ¤
Slice āĻŦāĻž map āĻā§āϞ⧠āĻĒā§āϰā§ā§āĻžāĻāύ⧠clear āĻāϰ⧠(
slice = nil)āĨ¤Tiny object āĻāĻŽ āϤā§āϰāĻŋ āĻāϰ⧠(GC overhead āĻāĻŽāĻŦā§)āĨ¤
đ§° ā§§ā§Ē. Real-world Example āĻāĻŦāĻ GC Analysis
āϧāϰāĻž āϝāĻžāĻ āĻāĻāĻāĻŋ API āϏāĻžāϰā§āĻāĻžāϰ āĻĒā§āϰāϤāĻŋ āϰāĻŋāĻā§ā§ā§āϏā§āĻā§ āĻ āύā§āĻāĻā§āϞ⧠temporary object āϤā§āϰāĻŋ āĻāϰā§:
func handler(w http.ResponseWriter, r *http.Request) {
buf := make([]byte, 1024*100)
process(buf)
}
āĻāĻāĻžāύ⧠āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ make([]byte, ...) āĻāϰāϞ⧠āύāϤā§āύ heap allocation āĻšā§āĨ¤
āĻāĻāĻžāĻŦā§ āĻĒā§āϰāϤāĻŋāύāĻŋā§āϤ heap āĻŦā§ āĻšāĻŦā§ āĻāĻŦāĻ GC āĻāύ āĻāύ āĻāϞāĻŦā§āĨ¤
āϏāĻŽāĻžāϧāĻžāύ:
var pool = sync.Pool{
New: func() interface{} { return make([]byte, 1024*100) },
}
func handler(w http.ResponseWriter, r *http.Request) {
buf := pool.Get().([]byte)
process(buf)
pool.Put(buf)
}
āĻāĻāĻžāĻŦā§ reusable memory pool āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϞ⧠GC load āĻ āύā§āĻ āĻāĻŽā§ āϝāĻžā§āĨ¤
đ ā§§ā§Ģ. Tools for GC Profiling
Go runtime āύāĻŋāĻā§āĻ āĻāĻŋāĻā§ powerful āĻā§āϞ āĻĻā§ā§ GC performance āĻŦā§āĻāĻžāϰ āĻāύā§āϝāĨ¤
đš pprof
go tool pprof http://localhost:6060/debug/pprof/heap
āĻāĻāĻŋ heap usage āĻāĻŦāĻ GC frequency āĻŦāĻŋāĻļā§āϞā§āώāĻŖ āĻāϰā§āĨ¤
đš runtime.ReadMemStats
var m runtime.MemStats
runtime.ReadMemStats(&m)
fmt.Println("GC count:", m.NumGC)
đš Trace
go test -trace trace.out
go tool trace trace.out
āĻāĻāĻžāύ⧠GC events timeline āĻāĻāĻžāϰ⧠āĻĻā§āĻāĻž āϝāĻžā§āĨ¤
đ§Š ā§§ā§Ŧ. Common GC Myths
| āĻŽāĻŋāĻĨ | āĻŦāĻžāϏā§āϤāĻŦāϤāĻž |
| Go GC āϧā§āϰ | Nope â pause time < 100Âĩs |
| GC āϏāĻŦ āĻŽā§āĻŽāϰāĻŋ āĻĢā§āϰāĻŋ āĻāϰ⧠āύāĻž | āĻ āĻŋāĻ, āĻāĻŋāĻā§ retained memory āĻāĻŦāĻŋāώā§āϝāϤā§āϰ allocation-āĻāϰ āĻāύā§āϝ āϰāĻžāĻāĻž āĻšā§ |
| GC āĻŽāĻžāύ⧠performance āĻāĻžāϰāĻžāĻĒ | āĻŦāĻžāϏā§āϤāĻŦā§ optimized workloads āĻ negligible |
| Manual free āĻĻāϰāĻāĻžāϰ | Go GC fully automatic, unsafe free āĻāϰāϞ⧠crash |
đĄ ā§§ā§. Best Practices for Developers
āĻā§āĻ-lived object stack āĻ āϰāĻžāĻā§
āĻ āĻĒā§āϰā§ā§āĻāύā§ā§ pointer field āĻŦāĻžāĻĻ āĻĻāĻžāĻ
GC tuning āĻāϰ⧠(GOGC, pool)
Large structure reuse āĻāϰā§
Channel buffer āĻāĻŦāĻ goroutine leak āĻāĻĄāĻŧāĻžāĻ
Heavy JSON encode/decode āĻ avoid āĻāϰ⧠temporary map
đ ā§§ā§Ž. Future of Go GC
Go āĻāĻŋāĻŽ āĻāĻāύ āĻāĻžāĻ āĻāϰāĻā§ Generational GC āύāĻŋā§ā§ â
āϝā§āĻāĻžāύ⧠short-lived object (âyoung generationâ) āĻāĻŦāĻ long-lived object (âold generationâ) āĻāϞāĻžāĻĻāĻž heap region āĻ āϰāĻžāĻāĻž āĻšāĻŦā§āĨ¤
āĻāϤā§:
Short-lived object āĻĻā§āϰā§āϤ āĻĢā§āϰāĻŋ āĻāϰāĻž āϝāĻžāĻŦā§
Long-lived object āĻŦāĻžāϰāĻŦāĻžāϰ āϏā§āĻā§āϝāĻžāύ āĻāϰāĻž āϞāĻžāĻāĻŦā§ āύāĻž
Latency āĻāϰāĻ āĻāĻŽāĻŦā§ (~10Âĩs āϞāĻā§āώā§āϝ)
āĻāĻāĻžā§āĻž āϤāĻžāϰāĻž Concurrent Compaction āĻāĻŦāĻ Thread-local GC pacing āύāĻŋā§ā§āĻ āĻāĻŦā§āώāĻŖāĻž āĻāϰāĻā§āĨ¤
đ§ž ā§§ā§¯. āĻāĻĒāϏāĻāĻšāĻžāϰ
Golang-āĻāϰ Garbage Collector āĻšāϞ⧠āĻāĻ āĻĻā§āϰā§āĻĻāĻžāύā§āϤ āĻāĻĻāĻžāĻšāϰāĻŖ, āĻāĻŋāĻāĻžāĻŦā§ āĻāĻāĻāĻŋ āĻāĻžāώāĻž high-performance concurrency āĻŦāĻāĻžā§ āϰā§āĻā§āĻ automatic memory management āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤
āĻāϰ āĻŽā§āϞ āĻļāĻā§āϤāĻŋ āϤāĻŋāύāĻāĻŋ āĻāĻžā§āĻāĻžā§:
Concurrent tri-color mark and sweep algorithm
Minimal stop-the-world
Adaptive tuning with GOGC
āĻāϰ āĻĢāϞ⧠Go āĻāĻ server-side, networking, container runtime, āĻāĻŽāύāĻāĻŋ distributed systems-āĻāϰ āĻāύā§āϝ āϏāĻŦāĻā§ā§ā§ āĻŦā§āĻļāĻŋ āĻŦā§āϝāĻŦāĻšā§āϤ āĻāĻžāώāĻžāĻā§āϞā§āϰ āĻāĻāĻāĻŋāĨ¤
âGo GC āĻāĻŽāύāĻāĻžāĻŦā§ āĻĄāĻŋāĻāĻžāĻāύ āĻāϰāĻž āϝā§, āĻāĻāĻŋ āĻĄā§āĻā§āϞāĻĒāĻžāϰāĻā§ āĻŽā§āĻŽāϰāĻŋ āύāĻŋā§ā§ āĻāĻŋāύā§āϤāĻž āύāĻž āĻāϰā§āĻ performance, simplicity āĻāĻŦāĻ scalability āĻāĻāϏāĻžāĻĨā§ āĻĻā§ā§āĨ¤â
Go (Golang) āĻāϰ Garbage Collector (GC) āĻā§āĻāĻžāĻŦā§ Heap āĻāϰ āĻā§āϤāϰā§āϰ āĻĄā§āĻāĻž āĻā§āϰā§āϝāĻžāĻ āĻāϰā§, āĻāϰ āϏā§āĻāĻž āĻāĻŋ Tree data structure āĻāĻāĻžāϰ⧠āĻāĻžāĻ āĻāϰ⧠āĻāĻŋāύāĻžāĨ¤
đ§ āϏāĻāĻā§āώāĻŋāĻĒā§āϤ āĻāϤā§āϤāϰ
āύāĻž â Go-āĻāϰ Garbage Collector heap āĻā§ āϏāϰāĻžāϏāϰāĻŋ āĻā§āύ⧠Tree data structure āĻāĻāĻžāϰ⧠āϏāĻāĻāĻ āĻŋāϤ āĻāϰ⧠āύāĻžāĨ¤
āĻŦāϰāĻ āĻāĻāĻŋ graph traversal āϧāĻžāϰāĻŖāĻžāϰ āĻāĻĒāϰ āĻāĻžāĻ āĻāϰā§, āϝā§āĻāĻžāύ⧠root references â heap objects â references to other objects āĻāĻāĻāĻžāĻŦā§ āĻāĻāĻāĻŋ directed graph āϤā§āϰāĻŋ āĻšā§āĨ¤
āϤāĻŦā§ āĻāĻ âgraphâ āĻāϰ āĻāĻžāĻ Tree āĻāϰ āĻŽāϤ⧠āĻŽāύ⧠āĻšāϤ⧠āĻĒāĻžāϰ⧠(āĻāĻžāϰāĻŖ object āĻā§āϞ⧠āĻ āύā§āϝ object āĻā§ reference āĻāϰā§), āĻāĻŋāύā§āϤ⧠Go GC-āϰ āĻ āĻā§āϝāύā§āϤāϰ⧠āĻāĻāĻž pointer graph, bitmap, āĻāĻŦāĻ span-based memory layout āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠â āĻā§āύ⧠explicit tree āύā§āĨ¤
đ āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ āĻŦā§āϝāĻžāĻā§āϝāĻž
đš ā§§. Heap āĻāϰ āĻāĻžāĻ āĻžāĻŽā§ (Memory Layout)
Go-āĻāϰ heap āĻā§āύ⧠binary tree āĻŦāĻž AVL tree āĻāϰ āĻŽāϤ⧠āύā§āĨ¤
Heap āĻā§ Go runtime āĻāĻžāĻ āĻāϰ⧠āϰāĻžāĻā§ āύāĻŋāĻā§āϰ āĻŽāϤā§:
Heap
âââ Span 1 â āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāĻāĻžāϰā§āϰ āĻāĻāĻĻāϞ object
âââ Span 2 â āĻ
āύā§āϝ āϏāĻžāĻāĻā§āϰ object
âââ Span 3
âââ ...
āĻĒā§āϰāϤāĻŋāĻāĻŋ span āĻ āĻāĻāϰāĻāĻŽ āϏāĻžāĻāĻā§āϰ object āĻĨāĻžāĻā§ (āϝā§āĻŽāύ 8 bytes, 16 bytes, 32 bytes āĻāϤā§āϝāĻžāĻĻāĻŋ)āĨ¤
āĻāĻāĻžāĻŦā§ memory fragmentation āĻāĻŽā§ āϝāĻžā§āĨ¤
āĻāĻ span āĻā§āϞā§āĻā§ track āĻāϰāϤ⧠runtime āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§:
mspan
mheap
mcentral
mcache
āĻāĻā§āϞ⧠āĻāĻāϏāĻžāĻĨā§ heap āĻāϰ allocator layer āϤā§āϰāĻŋ āĻāϰā§āĨ¤
đ āĻŽāύ⧠āϰāĻžāĻā§: āĻāĻāĻžāύ⧠âheapâ āĻŽāĻžāύ⧠data structure āύāĻž â āĻŽā§āĻŽāϰāĻŋāϰ āĻāĻāĻāĻž āĻŦā§ āĻāϞāĻžāĻāĻž āϝā§āĻāĻžāύ⧠object allocate āĻšā§āĨ¤
đš ⧍. Object Relationship â Tree āύāĻž Graph?
Go GC Tree āύāĻž, āĻŦāϰāĻ Directed Graph Traversal āĻĢāϞ⧠āĻāϰā§āĨ¤
āϧāϰāĻž āϝāĻžāĻ:
a := &Node{}
a.next = &Node{}
a.next.next = &Node{}
āĻāĻāĻžāύ⧠a object â āĻ
āύā§āϝ object āĻā§ reference āĻāϰāĻā§ â āĻāϰā§āĻāĻāĻž object āĻā§ āĻāϰāĻā§āĨ¤
āĻāĻāĻž āĻĻā§āĻāϤ⧠āĻāĻāĻāĻž linked tree-āĻāϰ āĻŽāϤ⧠āĻŽāύ⧠āĻšā§, āĻāĻŋāύā§āϤ⧠āĻāϏāϞ⧠āĻāĻāĻž graph (directed edges āϏāĻš)āĨ¤
āĻāĻžāϰāĻŖ āĻāĻāĻ object āĻšā§āϤ⧠āĻāĻāĻžāϧāĻŋāĻ āĻāĻžāϝāĻŧāĻāĻž āĻĨā§āĻā§ reference āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤
Root â A â B â C
â
D
āĻāĻāĻžāύ⧠C āĻ D āĻāĻāĻ subtree āύāĻž â āĻŦāϰāĻ interconnected nodesāĨ¤
GC āϝāĻāύ āĻāĻžāĻ āĻāϰā§, āϤāĻāύ āĻāĻāĻŋ root āĻĨā§āĻā§ graph traversal (DFS/BFS) āĻāϰ⧠reachable object āĻā§āϞ⧠āĻā§āĻāĻā§ āĻŦā§āϰ āĻāϰā§āĨ¤
đš ā§Š. Tri-Color Marking Algorithm āĻ Data Traversal
Go GC "tri-color marking" āĻ āĻĒā§āϰāϤāĻŋāĻāĻŋ object āĻā§ āϤāĻŋāύāĻāĻž āϰāĻā§ āĻāĻžāĻ āĻāϰā§:
White â Unreachable
Gray â Marked but not scanned
Black â Marked and scanned
Marking āĻāϰ āϏāĻŽā§ GC āĻāĻ âgraphâ traverse āĻāϰ⧠DFS āĻāϰ āĻŽāϤā§:
Root set āĻĨā§āĻā§ āĻļā§āϰ⧠āĻāϰā§āĨ¤
āĻĒā§āϰāϤāĻŋāĻāĻŋ gray node āĻāϰ reference āĻ āύā§āϏāϰāĻŖ āĻāϰ⧠āύāϤā§āύ node mark āĻāϰā§āĨ¤
āϏāĻŦ node black āĻšā§ā§ āĻā§āϞ⧠white node āĻā§āϞ⧠free āĻšā§āĨ¤
āĻāĻāĻž āĻāĻāϰāĻāĻŽ tree traversal-āĻāϰ āĻŽāϤ⧠āĻŽāύ⧠āĻšā§, āĻāĻŋāύā§āϤ⧠āĻāĻāĻŋ pointer-based graph traversal, āĻā§āύ⧠tree data structure āύā§āĨ¤
đš ā§Ē. āĻā§āύ Tree structure āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšā§ āύāĻž?
Tree data structure āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϞ⧠GC āĻā§ āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ āύāϤā§āύ object insert/delete āĻāϰ āϏāĻŽā§ heap āĻāϰ āĻāĻŋāϤāϰ⧠tree balance āϰāĻžāĻāϤ⧠āĻšāϤ⧠â
āĻāϤ⧠overhead āĻ
āύā§āĻ āĻŦā§ā§ā§ āϝā§āϤāĨ¤
āĻāϰ⧠āĻāĻŋāĻā§ āĻāĻžāϰāĻŖ:
Heap āĻ āĻĨāĻžāĻāĻž object āĻā§āϞā§āϰ āĻŽāϧā§āϝ⧠reference āĻ āύā§āĻ āϏāĻŽā§ cyclic āĻšāϤ⧠āĻĒāĻžāϰ⧠(āϝā§āĻŽāύ A â B â A)āĨ¤
Tree structure cyclic reference āĻšā§āϝāĻžāύā§āĻĄā§āϞ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āύāĻžāĨ¤GC traversal āĻĻāϰāĻāĻžāϰ pointer following, tree balancing āύāĻžāĨ¤
Span allocation āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ address range āĻāĻā§āĻ āĻāĻžāύāĻž āĻĨāĻžāĻā§āĨ¤
āϤāĻžāĻ GC heap āĻā§ tree āĻāĻāĻžāϰ⧠āύāĻž āϰā§āĻā§, flat memory space + pointer reference graph āĻāĻāĻžāϰ⧠āϰāĻžāĻā§āĨ¤
đš ā§Ģ. āϤāĻžāĻšāϞ⧠âHeapâ āύāĻžāĻŽ āĻā§āύ?
āĻāĻāĻžāύ⧠âheapâ āĻļāĻŦā§āĻĻāĻāĻž āĻāϏā§āĻā§ memory region āĻšāĻŋāϏā§āĻŦā§, heap data structure āĻšāĻŋāϏā§āĻŦā§ āύā§āĨ¤
āϝā§āĻŽāύ C/C++ āĻāϰ malloc āĻŦāĻž Rust āĻāϰ Box heap āĻ āĻŽā§āĻŽāϰāĻŋ āĻĻā§ā§ â āĻāĻāĻ āϧāĻžāϰāĻŖāĻžāĨ¤
āĻāĻ heap region-āĻ GC āĻāĻžāĻ āĻāϰ⧠object track āĻāϰāĻžāϰ āĻāύā§āϝ, āĻāĻŋāύā§āϤ⧠āĻā§āύ⧠âheap treeâ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āύāĻžāĨ¤
đš ā§Ŧ. āĻ āĻā§āϝāύā§āϤāϰā§āĻŖ āĻĄā§āĻāĻž āϏā§āĻā§āϰāĻžāĻāĻāĻžāϰ (Internal Structures)
Go runtime āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻŋāĻā§ internal structure:
mspan: contiguous memory region (same-size objects)mheap: āĻĒā§āϰ⧠heap āĻāϰ managerbitmap: āĻā§āύ address āĻ live object āĻāĻā§ āϏā§āĻāĻž mark āĻāϰā§arena: heap āĻāϰ āĻŦā§ memory chunkpage map: address â span mapping
āĻāĻā§āϞ⧠āĻāĻāϏāĻžāĻĨā§ heap track āĻāϰā§, āĻāĻŋāύā§āϤ⧠āĻā§āύ⧠tree structure āύā§āĨ¤
đ§ āϏāĻžāϰāϏāĻāĻā§āώā§āĻĒ
| āĻĒā§āϰāĻļā§āύ | āĻāϤā§āϤāϰ |
| Go GC āĻāĻŋ heap āĻ Tree data structure follow āĻāϰā§? | â āύāĻž |
| āϤāĻžāĻšāϞ⧠āĻā§āĻāĻžāĻŦā§ āĻāĻžāĻ āĻāϰā§? | Pointer-based Directed Graph Traversal |
| Heap āĻā§āĻŽāύāĻāĻžāĻŦā§ āϏāĻāĻāĻ āĻŋāϤ? | Span, arena, bitmap, mheap, mspan structure |
| āĻā§āύ Tree āύā§? | Tree cyclic reference handle āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āύāĻž, performance heavy |
| āĻā§āύ algorithm āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻšā§? | Tri-color concurrent mark-sweep |
đ āĻŽāύ⧠āϰāĻžāĻā§
Go-āĻāϰ Garbage Collector âheap treeâ āύā§, āĻŦāϰāĻ memory graph traversal engine, āϝāĻž pointer reference āĻ āύā§āϏāϰāĻŖ āĻāϰ⧠reachable object mark āĻāϰā§, āϤāĻžāϰāĻĒāϰ unreachable object sweep āĻāϰā§āĨ¤




