mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-08-12 00:43:26 +08:00
1.7 KiB
1.7 KiB
10.8 垃圾回收和SetFinalizer
Go开发者不需要写代码来释放程序中不再使用的变量和结构占用的内存,在Go运行时中有一个独立的进程,即垃圾收集器(GC),会处理这些事情,它搜索不再使用的变量然后释放它们的内存。可以通过runtime包访问GC进程。
通过调用runtime.GC()函数可以显式的触发GC,但这只在某些罕见的场景下才有用,比如当内存资源不足时调用runtime.GC(),它会此函数执行的点上立即释放一大片内存,此时程序可能会有短时的性能下降(因为GC进程在执行)。
如果想知道当前的内存状态,可以使用:
fmt.Printf(“%d\n”, runtime.MemStats.Alloc/1024)
上面的程序会给出已分配内存的总量,单位是Kb。进一步的测量参考:http://golang.org/pkg/runtime/#MemStatsType。
如果需要在一个对象obj被从内存移除前执行一些特殊操作,比如写到日志文件中,可以通过如下方式调用函数来实现:
runtime.SetFinalizer(obj, func(obj *typeObj))
func(obj *typeObj)需要一个typeObj类型的指针参数obj,特殊操作会在它上面执行。func也可以是一个匿名函数。
在对象被GC进程选中并从内存中移除以前,SetFinalizer都不会执行,即使程序正常结束或者发生错误。
练习 10.17:从练习10.16开始(它基于结构体实现了一个栈结构),为栈的实现(stack_struct.go)创建一个单独的包stack,并从main包main.stack.go中调用它。
链接
- 目录
- 上一节:10.7 类型的String()方法和格式化描述符
- 下一节:11.1 什么是接口