2013-12-12 81 views
3

我当时正在使用欲海golang垃圾收集输出

[email protected]:~/programs/Remodel$ GOGCTRACE=1 go run main.go 
gc1(1): 0+0+0 ms 0 -> 0 MB 422 -> 346 (422-76) objects 0 handoff 
gc2(1): 0+0+0 ms 0 -> 0 MB 2791 -> 1664 (2867-1203) objects 0 handoff 
gc3(1): 0+0+0 ms 1 -> 0 MB 4576 -> 2632 (5779-3147) objects 0 handoff 
gc4(1): 0+0+0 ms 1 -> 0 MB 3380 -> 2771 (6527-3756) objects 0 handoff 
gc5(1): 0+0+0 ms 1 -> 0 MB 3511 -> 2915 (7267-4352) objects 0 handoff 
gc6(1): 0+0+0 ms 1 -> 0 MB 6573 -> 2792 (10925-8133) objects 0 handoff 
gc7(1): 0+0+0 ms 1 -> 0 MB 4859 -> 3059 (12992-9933) objects 0 handoff 
gc8(1): 0+0+0 ms 1 -> 0 MB 4554 -> 3358 (14487-11129) objects 0 handoff 
gc9(1): 0+0+0 ms 1 -> 0 MB 8633 -> 4116 (19762-15646) objects 0 handoff 
gc10(1): 0+0+0 ms 1 -> 0 MB 9415 -> 4769 (25061-20292) objects 0 handoff 
gc11(1): 0+0+0 ms 1 -> 0 MB 6636 -> 4685 (26928-22243) objects 0 handoff 
gc12(1): 0+0+0 ms 1 -> 0 MB 6741 -> 4802 (28984-24182) objects 0 handoff 
gc13(1): 0+0+0 ms 1 -> 0 MB 9654 -> 5097 (33836-28739) objects 0 handoff 
gc1(1): 0+0+0 ms 0 -> 0 MB 209 -> 171 (209-38) objects 0 handoff 

帮助我理解了第一部分,即

0 + 0 + 0 =>标记+扫描+清洁倍

样本程序的程序

是否422 - > 346表示内存已经从422MB清理到346 MB? 如果是的话,那么当没有什么东西需要清理时,内存是如何减少的?

回答

3

从该线产生的输出:http://golang.org/src/pkg/runtime/mgc0.c?#L2147

所以不同部分是:

  • 0 + 0 + 0 MS:标记,扫描和清洁的持续时间以毫秒
  • 1 - > 0 MB:堆之前和之后在MB
  • 209 - 171:对象之前和之后
  • (209-38)对象:数allocs的并释放

越区切换(以及在Go 1.2中的偷窃和收益)是算法的内部结构。

5

在Go 1.5中,此输出的格式发生了很大变化。有关完整文档,请转至http://godoc.org/runtime并搜索“gctrace:”

gctrace: setting gctrace=1 causes the garbage collector to emit a single line to standard 
error at each collection, summarizing the amount of memory collected and the 
length of the pause. Setting gctrace=2 emits the same summary but also 
repeats each collection. The format of this line is subject to change. 
Currently, it is: 
    gC# @#s #%: #+...+# ms clock, #+...+# ms cpu, #->#-># MB, # MB goal, # P 
where the fields are as follows: 
    gC#  the GC number, incremented at each GC 
    @#s   time in seconds since program start 
    #%   percentage of time spent in GC since program start 
    #+...+#  wall-clock/CPU times for the phases of the GC 
    #->#-># MB heap size at GC start, at GC end, and live heap 
    # MB goal goal heap size 
    # P   number of processors used 
The phases are stop-the-world (STW) sweep termination, scan, 
synchronize Ps, mark, and STW mark termination. The CPU times 
for mark are broken down in to assist time (GC performed in 
line with allocation), background GC time, and idle GC time. 
If the line ends with "(forced)", this GC was forced by a 
runtime.GC() call and all phases are STW.