了解内存分配的工作方式和垃圾收集器

时间:2018-12-11 00:37:57

标签: go

说我要在几个演出的内存中进行缓存。 为了在缓存达到其最大大小时释放空间,我将删除那些没有被频繁访问的项目。

当我删除这些项目时,是否可以释放内存以供计算机分配给其他进程和/或我的应用程序? 我知道Go使用的是垃圾回收器,因此大概是操作系统在对其进行垃圾回收之前将无法访问该内存,然后我的应用程序将消耗更少的内存资源。

这正确吗?

1 个答案:

答案 0 :(得分:3)

确切地说,您将如何删除项目?

  

评论:

     

所以如果我将项目存储在一个切片中,我会做一个= append(a [:i],   a [i + 1:] ...)–布兰克曼

可能有效或无效。切片是什么类型?


  

Go SliceTricks

     

剪切

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

Go 1.4+ GC Plan and Roadmap

The Garbage Collection Handbook: The Art of Automatic Memory Management (Chapman & Hall/CRC Applied Algorithms and Data Structures series) R. Jones, A. Hosking, E. Moss