Files
the-way-to-go_ZH_CN/eBook/10.8.md
2015-08-24 19:37:44 +08:00

29 lines
1.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 10.8 垃圾回收和SetFinalizer
Go开发者不需要写代码来释放程序中不再使用的变量和结构占用的内存在Go运行时中有一个独立的进程即垃圾收集器(GC)会处理这些事情它搜索不再使用的变量然后释放它们的内存。可以通过runtime包访问GC进程。
通过调用runtime.GC()函数可以显式的触发GC但这只在某些罕见的场景下才有用比如当内存资源不足时调用runtime.GC()它会此函数执行的点上立即释放一大片内存此时程序可能会有短时的性能下降因为GC进程在执行
如果想知道当前的内存状态,可以使用:
```go
fmt.Printf(%d\n, runtime.MemStats.Alloc/1024)
```
上面的程序会给出已分配内存的总量单位是Kb。进一步的测量参考http://golang.org/pkg/runtime/#MemStatsType
如果需要在一个对象obj被从内存移除前执行一些特殊操作比如写到日志文件中可以通过如下方式调用函数来实现
```go
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中调用它。
## 链接
- [目录](directory.md)
- 上一节:[10.7 类型的String()方法和格式化描述符](10.7.md)
- 下一节:[11 接口Interfaces与反射reflection](11.0.md)