前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go: 查看GC的运行情况

go: 查看GC的运行情况

作者头像
运维开发王义杰
发布2023-08-16 20:20:27
7510
发布2023-08-16 20:20:27
举报
文章被收录于专栏:运维开发王义杰

Go的pprof包可以帮助你对程序的性能进行分析,包括CPU使用、内存分配以及协程的使用情况。但是要注意,对于GC的运行情况,pprof包并不能直接提供很详细的信息,需要通过其他方式。

使用pprof,你可以查看程序的内存分配情况,从而间接地了解GC的工作情况。以下是一个基本的示例,说明了如何启动HTTP服务器并提供pprof的端点:

代码语言:javascript
复制
import (
  "net/http"
  _ "net/http/pprof"
)

func main() {
  go func() {
    log.Println(http.ListenAndServe("localhost:6060", nil))
  }()
  // your program here...
}

然后,在浏览器中访问http://localhost:6060/debug/pprof/,你可以看到程序的各种性能数据。

对于内存使用情况,你可以访问http://localhost:6060/debug/pprof/heap来获取。这可以帮助你看到程序的内存分配情况,从而间接地了解GC的工作情况。

如果你想要查看更详细的GC运行情况,可以通过启用GC的调试跟踪。你可以设置GODEBUG=gctrace=1环境变量,然后运行你的程序。这样,每次GC运行时,都会在控制台输出一些信息,包括GC的运行时间、STW(Stop The World)的时间、内存的回收情况等。这些信息可以帮助你了解GC的具体运行情况。

例如,你可以在运行你的程序时这样设置环境变量:

代码语言:javascript
复制
GODEBUG=gctrace=1 go run your_program.go
GODEBUG=gctrace=1 ./your_program

然后,你就可以在控制台看到GC的调试跟踪信息了。

在启用GC的调试追踪后,每次进行垃圾回收时,都会在标准错误输出流(stderr)中输出一条追踪信息。下面是一个示例:

代码语言:javascript
复制
gc 1 @0.026s 35%: 15+1.7+0.73 ms clock, 46+1.7/1.0/2.8+2.2 ms cpu,4->4->1 MB, 5 MB goal, 4 P

这些字段的含义如下:

  • gc 1:这是第1次垃圾回收。
  • @0.026s:垃圾回收开始时,程序已经运行了0.026秒。
  • 35%:程序启动以来,约有35%的CPU时间用于垃圾回收。
  • 15+1.7+0.73 ms clock:本次垃圾回收耗时包括3个阶段。第一阶段(STW,Stop-The-World)耗时15毫秒,第二阶段并行标记耗时1.7毫秒,第三阶段(STW)耗时0.73毫秒。这些时间是以墙钟时间(wall-clock time)表示的,也就是真实经过的时间。
  • 46+1.7/1.0/2.8+2.2 ms cpu:与上面类似,但这些时间是CPU时间,是所有CPU花费的总时间。如果你有4个CPU,那么可能在1毫秒的墙钟时间内,有4毫秒的CPU时间被使用。
  • 4->4->1 MB:垃圾回收开始时,堆上的活动对象占用了4MB。在标记阶段结束后,发现还有4MB的对象是可达的。回收后,堆上的活动对象占用了1MB。
  • 5 MB goal:下一次垃圾回收预计在堆的活动对象占用达到5MB时开始。
  • 4 P:进行垃圾回收的CPU的数量。

这些数据可以帮助你理解垃圾回收的工作情况,包括它占用了多少CPU时间,每次垃圾回收的耗时,以及堆的内存使用情况。对于性能优化,通常需要关注的是垃圾回收的CPU时间占比,以及每次垃圾回收的耗时,尤其是STW的阶段。如果这些时间过长,可能会导致程序的性能下降。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-05-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维开发王义杰 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档