1

I'm trying to allocate memory with my "program" - just to allocate it and stay there - for testing purposes. When I run it on my MacOS the Activity Monitor shows it allocates 1.6 gb, when I compile it for linux and run it there it does nothing - it prints the message but the ram isn't being used on the machine. Am I doing it wrong? Is there a better way? Here is my code:

package main


import (
    "fmt"
    "unsafe"
    "time"
)


func main() {
    var buffer [100 * 1024 * 1024]string
    fmt.Printf("The size of the buffer is: %d bytes\n", unsafe.Sizeof(buffer))
    time.Sleep(300 * time.Second)
}

First I used byte for my array type, but it did not worked event on my mac?

1
  • 2
    Measuring "how much memory is used" was a simple task 25 years ago. It is no longer simple as there is a fast amount of different types of "memory". And "used" is a much to vague term for memory. Use the toolage provided by go test -benchmem to see how "allocation heavy" your code is. That metric is more reliable and more important. Commented Sep 21, 2015 at 11:23

1 Answer 1

5

There's nothing whatsoever in your code that requires memory. The compiler is perfectly within its rights to optimize the whole allocation away, and even if the compiler doesn't do it, the OS will not commit the memory - you're never assigning anything, so it's likely just mirroring a zero-page.

I don't know anything about the subtle differences between whatever Linux you're using and whatever MacOS you're using, so there's little that can be said with certainty. It might very well be that your way of checking memory on your linux machine gives you only committed memory, while you're seeing all virtual memory on your MacOS, or there might be other subtle differences. In any case, since compilers became smart and since we had virtual memory on PCs, it's been getting harder and harder to get any meaningful benchmarks - the tools we work with are usually smart enough to avoid unnecessary waste; and most benchmarks you'll try are pretty much completely unnecessary waste.

Benchmarking is hard.

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks, I'm just playing around and wanted to see what happens. This: "There's nothing whatsoever in your code that requires memory. The compiler is perfectly within its rights to optimize the whole allocation away, and even if the compiler doesn't do it" helped :) - I added for e, _ := range buffer { buffer[e] = "string" } and now when I run it on the linux box the mem used gets up with 1.6 gigs.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.