golang缓存内存占用情况测试

161 阅读1分钟

在设置进程内缓存的时候,除了过期时间,我们还需要限制缓存总大小的数量,防止出现OOM。所以,我们需要观测设置一定数量的缓存,内存的增长情况,以下是代码:

// 内存使用情况
func PrintMemUsage() {
	var m runtime.MemStats
	runtime.ReadMemStats(&m)
	fmt.Printf("Alloc = %v MiB", bToMb(m.Alloc))
	fmt.Printf("\tTotalAlloc = %v MiB", bToMb(m.TotalAlloc))
	fmt.Printf("\tSys = %v MiB", bToMb(m.Sys))
	fmt.Printf("\tNumGC = %v\n", m.NumGC)
}

// 转国际标(兆字节)
func bToMb(b uint64) uint64 {
	return b / 1024 / 1024
}

type Dog struct {
	Name string
}

func TestMapMem(t *testing.T) {
	m := map[string]Dog{}
	runtime.GC()
	PrintMemUsage()
	for i := 0; i < 1000000; i++ {
		d := Dog{Name: "name" + fmt.Sprintf("%d", i)}
		m[fmt.Sprintf("%d", i)] = d
	}
	runtime.GC()
	PrintMemUsage()
	z := m["1"]
	fmt.Println(z)
	runtime.GC()
	PrintMemUsage()
}

运行结果:
=== RUN   TestMapMem
Alloc = 0 MiB	TotalAlloc = 1 MiB	Sys = 11 MiB	NumGC = 1
Alloc = 103 MiB	TotalAlloc = 201 MiB	Sys = 191 MiB	NumGC = 9
{name1}
Alloc = 0 MiB	TotalAlloc = 201 MiB	Sys = 191 MiB	NumGC = 10
--- PASS: TestMapMem (0.43s)
PASS

根据运行结果,可以看到,100w个Dog对象,占用的内存大概是103M