您可以在禁用 Go 垃圾收集的情况下释放内存吗?



http://golang.org/ref/spec#Allocation

有一种方法可以分配内存,但我看不到释放内存的方法(未打开 Go GC)。

如果我想使用 Go 编写操作系统,我需要为 Go 编写一个低级 GC 或禁用 Go GC。在后一种情况下,如何释放内存?

PS - 这个话题已经在 Go 邮件列表中被广泛讨论,但我想向 SO 提出这个具体问题。

您可以通过使程序可以访问runtime·free来释放任意内存使用CGO。

例如,构建自己的包,称为mem并创建两个文件:

mem.go

package mem
import "unsafe"
import "reflect"
func FreePtr(p unsafe.Pointer)
func Free(v interface {}) {
    FreePtr(unsafe.Pointer(reflect.ValueOf(v).Elem().Pointer()))
}

运行时.c

// +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 %dn", m1.Frees, m2.Frees)
}

你应该看到有一个比以前更自由的。

最新更新