登录
首页 >  Golang >  Go问答

字符串与包含字符串的结构的内存使用情况

来源:stackoverflow

时间:2024-03-17 19:09:27 405浏览 收藏

使用切片存储字符串时,内存占用约为 145MiB,而将切片存储在包含字符串的结构中时,内存占用约为 260MiB。造成这种差异的原因是,在第二个示例中,每个结构体不仅包含字符串切片,还包含指向该切片的指针。指针和切片本身都占用内存,导致整体内存使用量增加。

问题内容

当附加到 [][]string 分析时,应用程序使用了大约 145mib 的内存。

defer profile.start(profile.memprofile).stop()

f, _ := os.open("test.csv") // 100 mib file
r := csv.newreader(f)

var records [][]string
for {
    values, err := r.read()
    if err == io.eof {
        break
    }
    records = append(records, values)
}

将切片存储在结构中并附加时,应用程序使用大约 260mib 的内存。

defer profile.Start(profile.MemProfile).Stop()

type record struct {
    values []string
}

f, _ := os.Open("test.csv") // 100 MiB File
r := csv.NewReader(f)

var records []record
for {
    values, err := r.Read()
    if err == io.EOF {
        break
    }
    r := record{values: values}
    records = append(records, r)
}

感觉好像在第二个示例中使用了双倍的内存。有人可以解释为什么第二个示例使用更多内存吗?


解决方案


对于那些在 go 1.12 和 go 1.15 之间使用的人,debug.FreeOSMemory() 不会将可用内存返回给操作系统,因此 htop/top 将显示错误的数字,或者如果您依赖 RSS 进行监控你的应用程序,它会是错误的。

这是因为 Golang (1.12 - 1.15) 中的运行时使用 MADV_FREE 而不是 MADV_DONTNEED.<= Go (1.11) 和 Go (1.16 - 几天前发布) 使用 MADV_DONTNEED

Go 1.16 恢复为 MADV_DONTNEED

请找到更改日志图像和更改日志 URL here

请升级以获得有关内存使用情况的可预测分析。如果您想使用 GoLang(1.12-1.15) 并且仍想使用 MADV_DONTNEED,请使用 GODEBUG=madvdontneed=1 ./main 运行您的二进制文件。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>