您可以通过禁用Go垃圾收集来释放内存吗?

时间:2013-11-07 22:56:09

标签: memory-management garbage-collection go

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

有一种分配内存的方法,但我没有看到解除内存的方法(没有打开Go GC)。

如果我想使用Go编写操作系统,我需要为Go编写低级GC或禁用Go GC。在后一种情况下,我怎么能释放记忆?

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

1 个答案:

答案 0 :(得分:5)

您可以通过程序访问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()))
}

runtime.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 %d\n", m1.Frees, m2.Frees)
}

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