photo of gray faucet

Como resolver memory leaks em maps

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 »

Implementando uma API com Fiber

Embora eu não tenha dito no post anterior, semana passada iniciamos uma nova série aqui no blog onde vamos implementar uma API bem simples em alguns frameworks web.

Dando continuidade a essa série, hoje vamos implementar uma API utilizando o Fiber, um framework inspirado no Express do Node e que trabalha com Fasthttp ao invés do net/http.

Como podemos ver no gráfico abaixo, uma de suas características mais marcantes é a performance.

Leia mais »

Resolvendo problemas com Go #4 – Two Sum

Para resolução desse problema, o mais comum seria usar um loop dentro do outro, porém como sempre queremos tirar a melhor performance, vamos tentar resolvê-lo usando uma hash table.

O problema do dia é o 1. Two Sum.

Encontrou outra forma para resolver ou ficou com alguma dúvida? Deixe nos comentários.

Até a próxima!


Se inscreva na nossa newsletter

* indicates required