以下代码声明了两个数组,然后遍历 stdin(只是盲目地遍历文件 - 不与数组交互)。
这导致内存不断增加。
但是,如果我只是声明两个数组并睡眠 - 内存不会增加。
同样,如果我只是遍历 stdin - 内存不会增加。
但是一起(除了为数组分配的内存)有一个持续的增加。
我通过使用 top 工具查看 RES 内存来衡量这一点。
我已经注释掉了中的前几行,func doSomething()
以表明注释时没有内存增加。取消注释行并运行将导致增加。
注意:这是在 1.4.2、1.5.3 和 1.6 上运行的
注意:您需要在至少具有 16GB RAM 的机器上重新创建它,因为我仅在 10 亿的阵列大小上观察到它。
package main
import (
"bufio"
"fmt"
"io"
"os"
)
type MyStruct struct {
arr1 []int
arr2 []int
}
func (ms *MyStruct) Init(size int, arr1 []int, arr2 []int) error {
fmt.Printf("initializing mystruct arr1...\n")
ms.arr1 = arr1
if ms.arr1 == nil {
ms.arr1 = make([]int, size, size)
}
fmt.Printf("initializing mystruct arr2...\n")
ms.arr2 = arr2
if ms.arr2 == nil {
ms.arr2 = make([]int, size, size)
}
fmt.Printf("done initializing ...\n")
for i := 0; i < size; i++ {
ms.arr1[i] = 0
ms.arr2[i] = 0
}
return nil
}
func doSomething() error {
fmt.Printf("starting...\n")
fmt.Printf("allocating\n")
/* NOTE WHEN UNCOMMENTED CAUSES MEMORY INCREASE
ms := &MyStruct{}
size := 1000000000
ms.Init(size, nil, nil)
*/
fmt.Printf("finished allocating..%d %d\n", len(ms.arr1), len(ms.arr2))
fmt.Printf("reading from stdin...\n")
reader := bufio.NewReader(os.Stdin)
var line string
var readErr error
var lineNo int = 0
for {
if lineNo%1000000 == 0 {
fmt.Printf("read %d lines...\n", lineNo)
}
lineNo++
line, readErr = reader.ReadString('\n')
if readErr != nil {
fmt.Printf("break at %s\n", line)
break
}
}
if readErr == io.EOF {
readErr = nil
}
if readErr != nil {
return readErr
}
return nil
}
func main() {
if err := doSomething(); err != nil {
panic(err)
}
fmt.Printf("done...\n")
}
这是我的代码的问题吗?还是 go 系统做了一些意想不到的事情?
如果是后者,我该如何调试呢?
精慕HU
相关分类