Memory management 在禁用Go垃圾收集的情况下,是否可以释放内存?

Memory management 在禁用Go垃圾收集的情况下,是否可以释放内存?,memory-management,garbage-collection,go,Memory Management,Garbage Collection,Go,有一种分配内存的方法,但我看不到一种释放内存的方法(不打开Go GC) 如果我想使用Go编写操作系统,我需要为Go编写一个低级GC,或者禁用Go GC。在后一种情况下,如何释放内存 PS-Go邮件列表中已经广泛讨论了这个主题,但我想提出这个具体问题。您可以通过让程序访问来释放任意内存 使用cgo 构建自己的包,例如,mem,并创建两个文件: mem.go runtime.c 你应该看到有一个比以前更免费。我以前考虑过这一点,这是有道理的。我找不到任何当前的运行时函数等价物,所以我接受这个答案。谢

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

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


PS-Go邮件列表中已经广泛讨论了这个主题,但我想提出这个具体问题。

您可以通过让程序访问来释放任意内存 使用cgo

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

mem.go runtime.c
你应该看到有一个比以前更免费。

我以前考虑过这一点,这是有道理的。我找不到任何当前的运行时函数等价物,所以我接受这个答案。谢谢。
runtime·free(void*v)
中的特殊字符是什么?中间点用于运行时的C代码和其他内部位置,表示函数的包关联。C不知道包,所以dot是将包带到Go C编译器的一种方法
runtime·free(void*v)
意味着
free
属于包
runtime
.nvm,在ubuntu上是ctrl+shift+u,然后是'00b7',然后是空格。它是Unicode中间点字符。谢谢。C和汇编程序中使用“·”字符而不是“.”,因为“.”在C中的标识符中是不合法的。您将看到是否反汇编一个go二进制文件(使用objdump-d),所有“·”在二进制文件中都写为“.”。
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)
}