[Go] memory arena
κ΄λ ¨ ν¬μ€νΈ
https://blog.naver.com/sssang97/223232328524
μ΄λλ μ λλ Goλ GC κΈ°λ°μ μΈμ΄μ΄κ³ , λ©λͺ¨λ¦¬μ ν λΉκ³Ό ν΄μ κ° μ±λ₯μμ λ³λͺ©μ΄ λ λλ λΆλͺ
ν μ‘΄μ¬νλ€.
κ·Έλ΄λ GC λΆλ΄μ μ€μ΄λ λ°©λ²μ μ¬λ¬κ°μ§ μ κ·Όλ²μ΄ μμ§λ§, κ°μ₯ νμ€ν건 μ무λλ ν λΉκ³Ό ν΄μ μ체λ₯Ό μμ£Ό νμ§ μλλ‘ μ λνλ κ²μ΄λ€.
λ΄μ₯ Memory Arena
κ·Έκ±Έ μν λνμ μΈ κΈ°λ₯ μ€ νλκ° λ°λ‘ memory arenaλΌλ κ²μ΄λ€.
Go 1.20λΆν° experimental λͺ¨λλ‘ μΆκ°λμλ€.
μ΄κ±΄ μμ ν¬κΈ°μ λ°μ΄ν° μ‘°κ°λ€μ λΆλ΄μμ΄ λΉ λ₯΄κ² ν λΉνκ³ νλ²μ λ°νν μ μλλ‘ νλ κ²μ λͺ©μ μΌλ‘ νλ€.
μ¬μ© ν¨ν΄ μμ²΄κ° νλ²μ λͺ°μμ ν μμλ€κ° λμ€μ λͺ°μμ μ 리ν΄λ λλ κ²½μ°μ μ ν©νλ€.
κ·Έλμ μΌμ΄ λλλ©΄ μλμΌλ‘ μ 리λ₯Ό ν΄μ€μΌ νλ€. κ·Έλ μ§ μμΌλ©΄ λμ λ¬Έμ κ° μκΈ΄λ€.
μ¬μ©λ²μ λλ΅ μ΄λ λ€.
arenaλΌλ μ΄λ¦μ λͺ¨λλ‘ importν μ μκ³

μ€νν λλ λͺ
μμ μΌλ‘ νμ±νλ₯Ό ν΄μ€μΌ νλ€.
μ¬μ©λ°©λ²μ κ·Έλ€μ§ μ΄λ ΅μ§ μλ€.
λ¨Όμ μ μ ν 곡κ°μ μμ±ν΄μ€μΌ νλ€.
μ κ² μΌμ’
μ 짬ν΅μ΄ λλ μ
μ΄λ€.
μ¬μ©μ΄ λ€ λλλ©΄ Free ν¨μλ‘ ν λΉν κ°μ²΄λ€μ μ λΆ λ λ €μ€λ€.
κ·Έλ¦¬κ³ κ°μ²΄λ₯Ό ν λΉν λλ New ν¨μλ₯Ό ν΅ν΄μ μνν μ μλ€.

κ°μ ν λΉλ 곡κ°μ λν ν¬μΈν°λ₯Ό λ°ννκ³ , μ΄λ₯Ό ν΅ν΄ κ°μ μμ νκ±°λ μ‘°νν μ μλ€.
κ·Έλ¦¬κ³ μμ Free ν¨μκ° μ€νλλ©΄ νλ²μ μΈκ·Έλ¦¬ μ 리λλ μ
μ΄λ€.
Free ν¨μκ° μ€νλ μ΄νμλ μ ν¬μΈν° νΈλ€λ€μ μ¬μ©νλ©΄ μλλ€.
μλλ μ 체 μμ μ½λλ€.
package main
import (
"arena"
"fmt"
)
func main() {
// arena μ μκ³΅κ° μμ±
mem := arena.NewArena()
defer mem.Free()
// ν λΉ
number := arena.New[int](mem)
*number = 4444
fmt.Println(*number)
// μ¬λΌμ΄μ€ ν λΉ
slice := arena.MakeSlice[string](mem, 100, 200)
fmt.Println(len(slice), cap(slice))
slice[0] = "Hello"
slice[1] = "World"
fmt.Println(slice[0], slice[1])
}
μ λμνλ€.
λ€λ§ νμ¬ arena ꡬνμ λ¬Έμ κ° λ§μμ μ κ±°λκ±°λ λ³κ²½λ κ°λ₯μ±μ΄ λ§λ€κ³ νλ€. μμΈν λ΄μ©μ μ΄μλ₯Ό μ°Έκ³ νλ€.
https://github.com/golang/go/issues/51317
μ μ΄λ κ·ΌμμΌμ μ΄ κΈ°λ₯μ΄ μμ νλ μΌμ μλκ±°κ°λ€.
λμ: μ§μ ꡬννκΈ°
λ²μ©μ±μ μ½κ° ν¬κΈ°νλ€λ©΄ μλ λλ₯Ό μ§μ ꡬννλ κ²λ μ΄λ ΅μ§λ μλ€.
ν λΉν΄μ λ₯Ό λ§κΈ° μν΄μλ root κ°μ²΄κ° κ·Έ κ°μ²΄μ ν¬μΈν°λ₯Ό λ€κ³ λ§ μμ΄λ λλλ°, any ν¬μΈν°λ λλ‘λ λ°μ΄ν°λ₯Ό λ€κ³ μκ²λ λ§λ€λ©΄ λκΈ° λλ¬Έμ΄λ€.
νΉμ λͺ¨λ λ³μλ€μ νλμ ꡬ쑰체μ λ€ μ μν΄λκ³ μμ 컨ν μ€νΈμμ μμ±ν λ€μμ ν¬μΈν°λ‘ 곡μ νλ μμΌλ‘ μ¬μ©ν΄λ κ±°μ λλ±ν λμμ κΈ°λν μλ μμ κ²μ΄λ€.
λμ: sync.Pool
μ¬μ© ννκ° μ‘°κΈ λ¬λΌμ λμμ΄λΌκ³ νκΈ΄ μ΄λ ΅μ§λ§, λΉμ·ν λμλ°©μμ κ°μ§ κΈ°λ₯μΌλ‘ sync.Poolμ΄ μλ€.
https://blog.naver.com/sssang97/223304134705
μ°Έμ‘°
https://uptrace.dev/blog/golang-memory-arena.html
https://github.com/golang/go/issues/51317
https://pyroscope.io/blog/go-1-20-memory-arenas/