go slice array allocation gotcha

February 21, 2017    general blog

Why is memory is allocated differently when you preallocate a slice and an array in golang.

slicey := make([]byte, 1024*1024)

top shows there is no extra memory allocated while a program with that slice is running.

arr := [1024*1024]byte{}

top shows that memory is allocated while that program is running.

I am baffled why there is difference when slice also has a backing array that need to be initialized?

Program you can run

package main

import (
	"fmt"
	"time"
)

func main() {
	fmt.Println("start")
	time.Sleep(10 * time.Second)
	fmt.Println("go!")
	slicey := make([]byte, 1024*1024)
	time.Sleep(time.Minute)
}

go run and check top

Note - I ran this on Mac OSX El Capitan