gpt4 book ai didi

logging - GOGCTRACE 和采集时间

转载 作者:IT王子 更新时间:2023-10-29 01:19:11 24 4
gpt4 key购买 nike

Go 支持 GOGCTRACE环境变量,并在每次运行时打印收集统计信息。但是,当 GC 发生时它不会打印。示例:

gc6231(8): 0+1+0 ms, 10 -> 5 MB 89540 -> 5294 (520316701-520311407) objects, 9(80) handoff, 32(404) steal, 288/168/37 yields

如何将收集行与其发生时间相关联?

最佳答案

跟踪显示的不是绝对时间,而是相对于输出的时间。当该行发生时,GC 发生在 0 + 1 + 0 毫秒前。

参见 the corresponding output line在代码中供引用。

如果你在 stdout 的每一行前面加上时间戳,你就可以得到 GC 运行的时间(时间戳 - 以毫秒为单位的时间 = GC 运行的时间)。

例子:

GOGCTRACE=1 ./myprog 2>&1 | while read line; do echo $(date +%s) $line; done

如果你只是想感受一下 GC 何时以秒为单位运行那么这就完全足够了。输出很可能不会落后太多即使是这样,您仍然有时间戳来获得正确的时间。

另一种解决方案是使用 ReadGCStats来自 runtime/debug 这给了你GCStats结构,它又具有time.Time 类型的字段 LastGC,保存最后一次 GC 运行的绝对时间。或者你可以使用 runtime.ReadMemStats ,这会为您提供更多信息。

当然,您仍然需要知道垃圾回收何时发生。为此你可以在你创建的对象上使用终结器,只是为了成为垃圾收藏并申请runtime.SetFinalizer在上面。在终结器中,您将读取 LastGC 时间并打印它。

示例(在 play 上):

type Garbage struct{ a int }

func notify(f *Garbage) {
stats := &runtime.MemStats{}
runtime.ReadMemStats(stats)

fmt.Println("Last GC was:", stats.LastGC)

go ProduceFinalizedGarbage()
}

func ProduceFinalizedGarbage() {
x := &Garbage{}
runtime.SetFinalizer(x, notify)
}

func main() {
go ProduceFinalizedGarbage()

for {
runtime.GC()
time.Sleep(30 * time.Second) // Give GC time to run
}
}

关于logging - GOGCTRACE 和采集时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17310899/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com