说我要在几个演出的内存中进行缓存。 为了在缓存达到其最大大小时释放空间,我将删除那些没有被频繁访问的项目。
当我删除这些项目时,是否可以释放内存以供计算机分配给其他进程和/或我的应用程序? 我知道Go使用的是垃圾回收器,因此大概是操作系统在对其进行垃圾回收之前将无法访问该内存,然后我的应用程序将消耗更少的内存资源。
这正确吗?
答案 0 :(得分:3)
确切地说,您将如何删除项目?
评论:
所以如果我将项目存储在一个切片中,我会做一个= append(a [:i], a [i + 1:] ...)–布兰克曼
可能有效或无效。切片是什么类型?
剪切
a = append(a[:i], a[j:]...)
删除
a = append(a[:i], a[i+1:]...) // or a = a[:i+copy(a[i:], a[i+1:])]
删除而不保留顺序
a[i] = a[len(a)-1] a = a[:len(a)-1]
注意如果元素的类型是指针或带指针的结构 上面的实现中需要垃圾回收的字段 “剪切”和“删除”操作有潜在的内存泄漏问题:某些元素 值仍被切片a引用,因此不能 集。以下代码可以解决此问题:
剪切
copy(a[i:], a[j:]) for k, n := len(a)-j+i, len(a); k < n; k++ { a[k] = nil // or the zero value of T } a = a[:len(a)-j+i]
删除
copy(a[i:], a[i+1:]) a[len(a)-1] = nil // or the zero value of T a = a[:len(a)-1]
删除而不保留顺序
a[i] = a[len(a)-1] a[len(a)-1] = nil a = a[:len(a)-1]
简单来说,Go GC(垃圾收集器)会保留内存,直到不再使用为止。除其他外,GC会跟踪已用内存中的所有指针,这是深入的使用情况分析。
Go Frequently Asked Questions (FAQ):Why do garbage collection? Won't it be too expensive?
The Go Blog: Go GC: Prioritizing low latency and simplicity
The Go Blog: Getting to Go: The Journey of Go's Garbage Collector