I am unable to reproduce your issue.

$ cat /proc/meminfo | grep 'MemTotal'
MemTotal:        3946772 kB
$ uname -v -p -r -s
Linux 4.4.0-75-generic #96-Ubuntu SMP Thu Apr 20 09:56:33 UTC 2017 x86_64
$ go version
go version go1.8.1 linux/amd64
$ cat ssd.go
package main

import (
    "fmt"
    "runtime/debug"
)

const N = 3e8

func f(x int) {
    ls := make([]uint64, N)
    for i := N - 1; i >= 0; i-- {
        ls[i] = uint64(i)
    }
    fmt.Println(ls[x])
}

func main() {
    debug.SetGCPercent(10)
    f(8)
    f(9)
}
$ go run ssd.go
8
9
$ 

Peter

On Monday, May 1, 2017 at 10:09:02 AM UTC-4, Serhat Şevki Dinçer wrote:
>
> <jesper.lou...@gmail.com <javascript:>> yazdı:
>
> Your program completes without any trouble on my machine, but do note if 
> we enter the following in an emacs scratch buffer and hit C-j to use it as 
> a glorified calculator:
>
> (/ (* 3e8 8) (* 1024 1024 1024))
> 2.2351741790771484
>
> If each element in your array takes up 8 bytes, which is the case for a 
> 64bit integer, then you need at least 2.2 gigabytes of memory to allocate 
> the array.
>
> Thanks for the arithmetic help, yes I am allocating 2+ gb ram
>
> Looking at your output, it is clear your operating system is not allowing 
> you to malloc some contiguous piece of space for this.
>
> My os IS allowing me to allocate the ram. Note that the "2nd" call fails.
>
> There are a couple of possible things to look out for:
>
> * 32bit systems can often allocate a constrained amount of memory in one 
> go.
> * You may be limited articifically by the operating system, either through 
> cgroups or the 'ulimit' facility, though the latter has a rather peculiar 
> way of working on linux.
> * You may not have enough memory in your system.
>
> In practice, a garbage collector will usually seek to allocate more space 
> than what is needed. If we run your program with 
>
> Mine is a laptop with 4 gb ram & Ubuntu 64-bit 16.04
>
> [jlouis@lady-of-pain z]$ GODEBUG=gctrace=1 ./z
> gc 1 @0.000s 16%: 0.003+0+0.34 ms clock, 0.014+0/0/0+1.3 ms cpu, 0->0->0 
> MB, 0 MB goal, 8 P (forced)
> gc 2 @0.020s 0%: 0.066+256+0.048 ms clock, 0.26+0/0.038/0.097+0.19 ms cpu, 
> 2288->2288->2288 MB, 2289 MB goal, 8 P
> 8
> 9
>
> we can see the garbage collector collects twice. The first one is probably 
> forced by the SetGCPercentage call. The second because of the rather large 
> allocation that is happening. And the amount of needed memory more or less 
> coincides with the 3e8 * 8 calculation above.
>
> If I have just the 1st call, there is no crash. After the 1st call 
> returns, 2nd call should be able to succeed.
> So what's happening?
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to