第十章修改 (#840)

Co-authored-by: Joe Chen <jc@unknwon.io>
This commit is contained in:
Haigang Zhou
2022-05-11 22:58:19 +08:00
committed by GitHub
parent 471d59af32
commit d3979794f4
9 changed files with 108 additions and 106 deletions

View File

@@ -1,6 +1,6 @@
# 10.8 垃圾回收和 SetFinalizer
Go 开发者不需要写代码来释放程序中不再使用的变量和结构占用的内存,在 Go 运行时中有一个独立的进程,即垃圾收集器GC,会处理这些事情,它搜索不再使用的变量然后释放它们的内存。可以通过 `runtime` 包访问 GC 进程。
Go 开发者不需要写代码来释放程序中不再使用的变量和结构占用的内存,在 Go 运行时中有一个独立的进程,即垃圾收集器 (GC),会处理这些事情,它搜索不再使用的变量然后释放它们的内存。可以通过 `runtime` 包访问 GC 进程。
通过调用 `runtime.GC()` 函数可以显式的触发 GC但这只在某些罕见的场景下才有用比如当内存资源不足时调用 `runtime.GC()`,它会在此函数执行的点上立即释放一大片内存,此时程序可能会有短时的性能下降(因为 `GC` 进程在执行)。
@@ -16,7 +16,7 @@ fmt.Printf("%d Kb\n", m.Alloc / 1024)
上面的程序会给出已分配内存的总量,单位是 Kb。进一步的测量参考 [文档页面](http://golang.org/pkg/runtime/#MemStatsType)。
如果需要在一个对象 obj 被从内存移除前执行一些特殊操作,比如写到日志文件中,可以通过如下方式调用函数来实现:
如果需要在一个对象 `obj` 被从内存移除前执行一些特殊操作,比如写到日志文件中,可以通过如下方式调用函数来实现:
```go
runtime.SetFinalizer(obj, func(obj *typeObj))
@@ -26,12 +26,12 @@ runtime.SetFinalizer(obj, func(obj *typeObj))
在对象被 GC 进程选中并从内存中移除以前,`SetFinalizer` 都不会执行,即使程序正常结束或者发生错误。
**练习 10.17**
**练习 10.17** [main_stack.go](exercises\chapter_10\main_stack.go)
从练习 10.16 开始(它基于结构体实现了一个栈结构),为栈的实现stack_struct.go创建一个单独的包 `stack`,并从 `main``main.stack.go` 中调用它。
从练习 10.16 开始(它基于结构体实现了一个栈结构),为栈的实现 ([stack_struct.go](exercises\chapter_10\stack_struct.go)) 创建一个单独的包 `stack`,并从 `main``main.stack.go` 中调用它。
## 链接
- [目录](directory.md)
- 上一节:[类型的 String() 方法和格式化描述符](10.7.md)
- 下一章:[接口Interfaces与反射reflection](11.0.md)
- 下一章:[接口 (Interfaces) 与反射 (reflection)](11.0.md)