Golang的GC信息

lyhuzi · · 10385 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

一、GC信息的信息收集

设置环境变量GODEBUG=gctrace=1。

使用方法,如果程序为myserver。正常的启动方法为./myserver,如果需要收集GC信息启动方式如下GODEBUG=gctrace=1  ./myserver。

二、GC信息分析

gc5(6): 11+12+357+77 us, 0 -> 1 MB, 4294 (5261-967) objects, 67/2/0 sweeps, 6(115) handoff, 6(9) steal, 170/56/5 yields

gc5(6):表示第5次GC,共有6个线程参与GC。

11+12+357+77 us:表示停止各个goroutine花费时间是11us,释放标记对象所有时间为12us,扫描标记可回收对象花费时间为257us,完成各个线程结束为17us。GC总时间为457us。

0 -> 1 MB:表示上次GC后堆占用的空间为0MB,本次GC前堆占用的空间为1MB。

4294 (5261-967) objects:表示剩余未释放对象个数为4294个,GC之前拥有对象为5261个,本次GC释放对象967个。

基本规律是当前对象越多,扫描时间越长,需要释放的对象越多,释放过程越长。

三、GC需要注意的事情

因为golang中GC过程中需要把程序中所有goroutine全部停止,造成程序就像夯住一样,所以对于实时性要求比较高的程序要慎重使用golang语言。一个可以参考的建议,如果想要减少gc时间,就要减少对象数量,所以,如果可以尽量在代码中将对象进行复用。以减少临时对象数量,从而减少GC时间。

当然GC是可以关闭的,这样对于实时性要求高的程序可以推荐一种实现模式:

用一个主进程fock出两个子进程,两个子进程轮流提供服务,先让一个子进程提供服务,另一个子进程休眠。当提供服务的子进程工作一段时间后对象数量累计过多时,唤醒另一个子进程开始工作,本子进程开始GC,GC后进入休眠等待被唤醒。这样就避免掉了因为GC问题引起的不定时夯住的问题。

四、建议

对于实时性要求比较高的程序,一定要关注GC问题。因为golang的GC非常稚嫩,与java相比还差的很远,如果你不关心GC问题,很可能会引起项目的失败。也许将来golang的GC做的像java一样优秀,那上面所说的就没用了。

五、参考:

https://software.intel.com/en-us/blogs/2014/05/10/debugging-performance-issues-in-go-programs

本文来自:CSDN博客

感谢作者:lyhuzi

查看原文:Golang的GC信息

10385 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传