Uma das formas mais comuns de se fazer cache em aplicações Go é utilizando um map. Se você já fez isso, deve ter notado um aumento gradual no consumo de memória, e que normalmente após um restart da máquina ou pod volta ao “normal”.
Isso acontece devido a forma como o map funciona. Por isso, antes de ver o que podemos fazer para resolver esse tipo de problema, vamos entender melhor o map.
Para exemplificar o problema, vamos considerar uma variável do tipo map[int][128]byte
, que será “carregada” com 1 milhão de elementos e que na sequência serão removidas.
package main import ( "fmt" "runtime" ) func main() { n := 1_000_000 m := make(map[int][128]byte) printAlloc() for i := 0; i < n; i++ { m[i] = [128]byte{} } printAlloc() for i := 0; i < n; i++ { delete(m, i) } runtime.GC() printAlloc() runtime.KeepAlive(m) } func printAlloc() { var m runtime.MemStats runtime.ReadMemStats(&m) fmt.Printf("%d KB\\n", m.Alloc/1024) }Leia mais »