http://golang.org/ref/spec#Allocation
有一种分配内存的方法,但我看不到释放内存的方法(没有打开 Go GC)。
如果我想使用 Go 编写操作系统,我需要为 Go 编写低级 GC 或禁用 Go GC。在后一种情况下,我怎样才能释放内存?
PS - 这个话题已经在 Go 邮件列表中被广泛讨论过,但我想向 SO 提出这个具体问题。
http://golang.org/ref/spec#Allocation
有一种分配内存的方法,但我看不到释放内存的方法(没有打开 Go GC)。
如果我想使用 Go 编写操作系统,我需要为 Go 编写低级 GC 或禁用 Go GC。在后一种情况下,我怎样才能释放内存?
PS - 这个话题已经在 Go 邮件列表中被广泛讨论过,但我想向 SO 提出这个具体问题。
runtime·free
您可以通过使用 cgo 访问您的程序来释放任意内存。
例如,构建您自己的包,mem
并创建两个文件:
package mem
import "unsafe"
import "reflect"
func FreePtr(p unsafe.Pointer)
func Free(v interface {}) {
FreePtr(unsafe.Pointer(reflect.ValueOf(v).Elem().Pointer()))
}
// +build gc
#include <runtime.h>
void ·Free(void* foo) {
runtime·free(foo);
}
示例用法(释放切片并打印释放次数):
import "free/mem"
func main() {
var m1, m2 runtime.MemStats
runtime.ReadMemStats(&m1)
c := make([]int, 10000)
inspect.Free(&c)
runtime.ReadMemStats(&m2)
fmt.Printf("%d vs %d\n", m1.Frees, m2.Frees)
}
你应该看到比以前多了一个免费的。