一、gc分析命令
GODEBUG=gctrace=1 go run *.go
二、执行命令,分析内容如下
gc 1 @0.001s 13%: 0.004+2.5+0.023 ms clock, 0.019+0.18/1.7/2.3+0.094 ms cpu, 4->6->6 MB, 5 MB goal, 4 P
gc 2 @0.017s 6%: 0.002+4.1+0.020 ms clock, 0.009+0/3.4/5.6+0.082 ms cpu, 10->11->9 MB, 12 MB goal, 4 P
gc 3 @0.047s 6%: 0.002+7.0+0.002 ms clock, 0.011+2.1/6.8/7.0+0.010 ms cpu, 16->21->20 MB, 19 MB goal, 4 P
gc 4 @0.128s 4%: 0.002+10+0.019 ms clock, 0.009+0.20/9.8/26+0.077 ms cpu, 32->32->30 MB, 40 MB goal, 4 P
gc 5 @0.203s 5%: 0.002+19+0.016 ms clock, 0.011+1.2/19/40+0.067 ms cpu, 53->55->50 MB, 60 MB goal, 4 P
gc 6 @0.486s 3%: 0.002+36+0.023 ms clock, 0.010+0.17/35/73+0.093 ms cpu, 95->98->87 MB, 101 MB goal, 4 P
gc 7 @1.128s 3%: 0.003+71+0.066 ms clock, 0.013+9.1/64/125+0.26 ms cpu, 168->173->153 MB, 175 MB goal, 4 P
gc 7:表示第7次GC,共有4个P (线程)参与GC。
3%: 表示gc 占时间比。
0.003+71+0.066 us:STW(stop-the-world)0.003ms, 并发标记和扫描的时间71ms, STW标记的时间0.066ms。
0.013+9.1/64/125+0.26 ms cpu, 表示垃圾回收占用cpu时间
168->173->153 MB, 175 MB goal,表示堆的大小,gc后堆的大小,存活堆的大小
175 MB goal 表示整体堆的大小为175M。
根据官方描述,golang1.0 的gc 可以降到100ms 以内,如果gc 超过1s了,说明gc 是有异常的,需要优化。