1. 调用带内联框架的堆栈
运行时的用户应避免直接检查所产生的PC切片,而应使用runtime.CallersFrames获取调用堆栈的完整视图,或运行时.Caller来获取有关单个调用者的信息。这是因为PC切片的单个元素不能解释调用堆栈的内联框架或其他细微差别。
具体来说,直接迭代PC切片并使用诸如runtime.FuncForPC之类的功能的代码单独解析每个PC将错过内联框架。要获得堆栈的完整视图,这些代码应改为使用CallersFrames。同样,代码不应该假设Callers返回的长度是呼叫深度的任何指示。它应该计算CallersFrames返回的帧数。
在特定深度查询单个呼叫者的代码应该使用Caller,而不是将长度为1的片段传递给Callers。
runtime.CallersFrames从Go 1.7开始就可以使用,所以可以在升级到Go 1.9之前更新代码。
说明:
通过修改了内部部分这种代码结构能够做到节省空间和执行时间。简单点说就是将这两个函数
func a(b int) int {return b * b}
func c(b int) int {return a(b) + 5}
转换成一个函数
func c(b int) int {return b * b + 5}
另外,runtime.CallersFrames自Go 1.7以来一直可用,因此可以在升级到Go 1.9之前更新代码。
2. 优化垃圾收集器
库函数用于触发世界垃圾收集现在触发并发垃圾收集。具体来说,runtime.GC,debug.SetGCPercent和debug.FreeOSMemory,现在触发并发垃圾回收,只阻止调用goroutine直到垃圾收集完成。
如果由于新GOGC值而立即需要,debug.SetGCPercent函数仅触发垃圾回收。这使得可以即时调整GOGC。
大型对象分配性能在使用大型(> 50GB)堆包含许多大型对象的应用程序中得到显着改善。