golang gctrace分析gc过程

78

golang/gc

三色标记法

图片原图:https://en.wikipedia.org/wiki/Tracing_garbage_collection#/media/File:Animation_of_tri-color_garbage_collection.gif

(1)、有黑白灰三个集合。初始时所有对象都是白色。

(2)、从Root对象开始标记(协程栈, 全局对象等), 将所有可达对象标记为灰色。

(3)、从灰色对象集合取出对象, 将其引用的对象标记为灰色, 放入灰色集合, 并将自己标记为黑色。

(4)、重复第三步, 直到灰色集合为空, 即所有可达对象都被标记。

(5)、标记结束后, 不可达的白色对象即为垃圾。对内存进行迭代清扫, 回收白色对象。

(6)、重置GC状态。

使用gctrace分析gc的实际情况

Golang,自带gc,在不改动代码的情况下,我们可以设置GODEBUG='gctrace=1’环境变量启动程序,来向标准错误输出打印,查看gc 是否有异常:

GODEBUG=gctrace=1 go test .  -run=^$ -bench=BenchmarkLeak -benchtime 20s -test.memprofile=mem.profile -benchmem
gc 66 @2.988s 3%: 0.076+9.7+0.015 ms clock, 1.2+38/37/0.11+0.24 ms cpu, 313->321->160 MB, 323 MB goal, 16 P
gc 67 @3.047s 3%: 0.054+9.8+0.067 ms clock, 0.87+4.0/37/33+1.0 ms cpu, 310->319->162 MB, 321 MB goal, 16 P
gc 68 @3.110s 3%: 0.12+8.9+0.041 ms clock, 2.0+6.3/33/36+0.66 ms cpu, 315->322->160 MB, 325 MB goal, 16 P
gc 69 @3.173s 3%: 0.061+8.9+0.033 ms clock, 0.97+46/35/0+0.53 ms cpu, 313->320->161 MB, 321 MB goal, 16 P
gc 70 @3.232s 3%: 0.065+9.4+0.004 ms clock, 1.0+10/36/36+0.078 ms cpu, 311->321->163 MB, 322 MB goal, 16 P
gc 71 @3.294s 3%: 0.10+9.8+0.030 ms clock, 1.7+18/38/27+0.49 ms cpu, 317->325->164 MB, 327 MB goal, 16 P
gc 42: 表示第42次GC,共有16个P (线程)参与GC。

@3.294s: @后面的数字表示程序启动经历的时间.

3%: 表示gc 占时间比。

0.10+9.8+0.030 ms: STW(stop-the-world)0.11ms, 并发标记和扫描的时间9.8ms, STW标记的时间0.030ms。

1.7+18/38/27+0.49 ms cpu, 表示垃圾回收占用cpu时间

317->325->164 MB: 表示堆的大小,gc后堆的大小,存活堆的大小

327 MB goal 表示整体堆的大小为327M。