- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
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/
Go 支持 GOGCTRACE环境变量,并在每次运行时打印收集统计信息。但是,当 GC 发生时它不会打印。示例: gc6231(8): 0+1+0 ms, 10 -> 5 MB 89540 -> 52
我是一名优秀的程序员,十分优秀!