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

Bre*_*den 4 garbage-collection memory-management go

http://golang.org/ref/spec#分配

有一种分配内存的方法,但是我看不到一种分配内存的方法(在未打开Go GC的情况下)。

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

PS-在Go邮件列表中已经广泛讨论了这个主题,但是我想向SO提出这个特定问题。

nem*_*emo 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()))
}
Run Code Online (Sandbox Code Playgroud)

运行时

// +build gc
#include <runtime.h>

void ·Free(void* foo) {
    runtime·free(foo);
}
Run Code Online (Sandbox Code Playgroud)

用法示例(释放一片并打印出多少次释放):

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)
}
Run Code Online (Sandbox Code Playgroud)

您应该看到比以前多了一个免费版本。

  • nvm,在ubuntu上是ctrl + shift + u,然后是“ 00b7”,然后是空格。这是Unicode中点字符。谢谢。 (2认同)
  • 在C和汇编语言中使用'·'字符,而不是'。',因为'。' 在C中的标识符中是不合法的。您会看到,如果您对go二进制文件(用objdump -d进行反汇编)进行了反汇编,则所有“·”都写为“。”。在二进制文件中。 (2认同)