加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Golang的GC信息

发布时间:2020-12-16 18:44:06 所属栏目:大数据 来源:网络整理
导读:一、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) obj

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读