【问题标题】:Decipher garbage collection output解密垃圾收集输出
【发布时间】:2013-12-12 18:48:44
【问题描述】:

我正在使用

运行一个示例程序程序
rahul@g3ck0:~/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 清理到 346MB? 如果是,那么在没有什么要清理的情况下,内存怎么会减少呢?

【问题讨论】:

    标签: garbage-collection go


    【解决方案1】:

    在 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.
    

    【讨论】:

      【解决方案2】:

      从这一行生成输出:http://golang.org/src/pkg/runtime/mgc0.c?#L2147

      所以不同的部分是:

      • 0+0+0 ms : 标记、扫描和清除持续时间,单位为 ms
      • 1 -> 0 MB : 以 MB 为单位的前后堆
      • 209 - 171 : 之前和之后的对象
      • (209-38) 个对象:分配和释放的数量

      切换(以及在 Go 1.2 中的窃取和让步)是算法的内部结构。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-21
        • 2014-11-19
        • 1970-01-01
        • 2018-12-30
        • 1970-01-01
        • 1970-01-01
        • 2015-12-19
        • 2021-03-25
        相关资源
        最近更新 更多