【发布时间】:2017-11-23 03:45:01
【问题描述】:
我写了这段代码:
package main
import (
"log"
)
func main() {
var c []int64
for i := 0; i < 100; i++ {
c = make([]int64, 10000000000)
log.Println(len(c))
}
}
此代码内存不足:fatal error: runtime: out of memory。
在每次迭代中,c 将被分配一个新切片。所以前一个切片是不可访问的。为什么 GC 似乎没有收集到无法访问的内存?
【问题讨论】:
-
80 GB 内存!?
-
@icza:这不是重复的。这是过度分配的情况,尝试在一次分配中分配 80GB,但立即失败:
fatal error: runtime: out of memory。正式而言,要成为重复项,答案必须相同。在这种情况下,答案是进行合理大小的分配。在您的回答中,这是对 GC 空闲内存机制的解释,虽然很有趣,但并不能解决这个问题。 . -
@peterSO 这就是为什么我只写“相关”而不是“重复”。
-
尝试运行下一条命令
ulimit -c unlimited
标签: go garbage-collection