Golang的GC信息

一、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信息

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。