go gc信息如何查看

目录

  • 1.几种常见方法
    • 1.1.设置环境变量 GODEBUG打印GC日志
    • 1.2.使用 debug.ReadGCStats
    • 1.3.使用 runtime.ReadMemStats
  • 2.GC日志打印示例
  • 3.参考

在Go语言中,可以通过设置环境变量和使用运行时包中的调试功能来打印垃圾回收(GC)的信息。

1.几种常见方法

1.1.设置环境变量 GODEBUG打印GC日志

通过设置 GODEBUG 环境变量来启用GC的详细日志。
具体来说,设置 GODEBUG=gctrace=1 可以打印GC的详细信息。

示例
在运行Go程序时,设置环境变量:

GODEBUG=gctrace=1 go run your_program.go

或者在代码中设置环境变量:

package mainimport ("os""runtime"
)func main() {// 设置环境变量os.Setenv("GODEBUG", "gctrace=1")// 触发GC以查看日志runtime.GC()// 你的程序逻辑
}

1.2.使用 debug.ReadGCStats

可以使用 runtime/debug 包中的 SetGCPercent 函数来调整GC的频率,并通过 PrintGCStats 函数打印GC的统计信息。
示例

package mainimport ("fmt""runtime/debug""time"
)func main() {// 设置GC的频率debug.SetGCPercent(100)// 启动一个goroutine定期打印GC统计信息go func() {var stats debug.GCStatsfor {time.Sleep(10 * time.Second)debug.ReadGCStats(&stats)fmt.Printf("GC Stats: %+v\n", stats)}}()// 模拟一些内存分配for i := 0; i < 10; i++ {_ = make([]byte, 10<<20) // 10 MBtime.Sleep(1 * time.Second)}
}

output:

GC Stats: {
LastGC:2024-08-24 11:41:57.930373 +0800 CST 
NumGC:10 
PauseTotal:657.732µs 
Pause:[38.41µs 79.84µs 41.56µs 44.338µs 45.675µs 75.914µs 98.979µs 94.937µs 107.504µs 30.575µs] PauseEnd:[2024-08-24 11:41:57.930373 +0800 CST 2024-08-24 11:41:56.928724 +0800 CST 2024-08-24 11:41:55.926835 +0800 CST 2024-08-24 11:41:54.924951 +0800 CST 2024-08-24 11:41:53.922546 +0800 CST 2024-08-24 11:41:52.920353 +0800 CST 2024-08-24 11:41:51.917256 +0800 CST 2024-08-24 11:41:50.914207 +0800 CST 2024-08-24 11:41:49.912043 +0800 CST 2024-08-24 11:41:48.90515 +0800 CST] 
PauseQuantiles:[]}

1.3.使用 runtime.ReadMemStats

可以使用 runtime 包中的 ReadMemStats 函数来获取GC的统计信息,并手动打印这些信息。
示例

package mainimport ("fmt""runtime""time"
)func main() {// 启动一个goroutine定期打印GC统计信息go func() {var m runtime.MemStatsfor {time.Sleep(10 * time.Second)runtime.ReadMemStats(&m)fmt.Printf("Alloc = %v MiB", m.Alloc/1024/1024)fmt.Printf("\tTotalAlloc = %v MiB", m.TotalAlloc/1024/1024)fmt.Printf("\tSys = %v MiB", m.Sys/1024/1024)fmt.Printf("\tNumGC = %v\n", m.NumGC)}}()// 模拟一些内存分配for i := 0; i < 10; i++ {_ = make([]byte, 10<<20) // 10 MBtime.Sleep(1 * time.Second)}
}

output:

Alloc = 0 MiB	TotalAlloc = 100 MiB	Sys = 20 MiB	NumGC = 10

小结

  • 设置环境变量 GODEBUG:通过设置 GODEBUG=gctrace=1 可以启用GC的详细日志。
  • 使用 runtime/debug 包:可以使用 SetGCPercent 和 ReadGCStats 函数来调整GC频率和打印GC统计信息。
  • 使用 runtime 包:可以使用 ReadMemStats 函数来获取和打印GC的统计信息。

通过这些方法,你可以方便地获取和打印GC的日志信息,以便进行性能调优和问题排查。

2.GC日志打印示例

以下是一个完整的示例,展示了如何在运行Go程序时通过设置环境变量来打印垃圾回收(GC)日志。这个示例程序还会模拟一些内存分配,以便触发垃圾回收。

示例代码
首先,创建一个Go程序文件,例如 main.go,并将以下代码粘贴到文件中:

package mainimport ("fmt""runtime""time"
)func main() {// 启动一个goroutine定期打印GC统计信息go func() {var m runtime.MemStatsfor {time.Sleep(10 * time.Second)runtime.ReadMemStats(&m)fmt.Printf("Alloc = %v MiB", m.Alloc/1024/1024)fmt.Printf("\tTotalAlloc = %v MiB", m.TotalAlloc/1024/1024)fmt.Printf("\tSys = %v MiB", m.Sys/1024/1024)fmt.Printf("\tNumGC = %v\n", m.NumGC)}}()// 模拟一些内存分配以触发GCfor i := 0; i < 10; i++ {_ = make([]byte, 10<<20) // 10 MBtime.Sleep(1 * time.Second)}
}

运行示例
在终端中运行以下命令来设置环境变量并运行Go程序:

GODEBUG=gctrace=1 go run main.go

解释

  • 设置环境变量:通过在运行程序时设置 GODEBUG=gctrace=1 环境变量,启用GC的详细日志。
  • 定期打印GC统计信息:程序启动一个goroutine,每10秒钟打印一次GC的统计信息,包括已分配的内存、总分配的内存、系统内存和GC的次数。
  • 模拟内存分配:在主goroutine中,每秒钟分配10MB的内存,共分配10次,以触发垃圾回收。

GC日志示例
运行程序后,会在终端中看到类似以下的GC日志输出:


gc 1 @0.065s 0%: 0.010+2.7+0.003 ms clock, 0.10+0.16/2.9/2.1+0.034 ms cpu, 4->4->0 MB, 5 MB goal, 10 P
gc 2 @0.125s 0%: 0.027+0.47+0.003 ms clock, 0.27+0.097/1.0/0.43+0.033 ms cpu, 4->4->0 MB, 5 MB goal, 10 P
gc 3 @0.180s 0%: 0.031+1.0+0.10 ms clock, 0.31+0.75/0.80/1.0+1.0 ms cpu, 4->4->0 MB, 5 MB goal, 10 P
gc 4 @0.399s 1%: 0.76+2.6+4.3 ms clock, 7.6+2.0/1.8/0+43 ms cpu, 4->4->1 MB, 5 MB goal, 10 P
gc 5 @0.477s 1%: 0.25+2.6+0.004 ms clock, 2.5+0.38/1.0/2.0+0.042 ms cpu, 4->4->1 MB, 5 MB goal, 10 P
gc 6 @0.491s 1%: 0.092+9.8+0.003 ms clock, 0.92+0/10/1.9+0.033 ms cpu, 4->4->0 MB, 5 MB goal, 10 P
gc 7 @0.518s 1%: 0.093+0.62+0.004 ms clock, 0.93+0.19/1.0/0.23+0.049 ms cpu, 4->4->0 MB, 5 MB goal, 10 P
gc 8 @0.528s 1%: 0.043+0.98+0.004 ms clock, 0.43+0.13/0.95/0.62+0.047 ms cpu, 4->4->1 MB, 5 MB goal, 10 P
# command-line-arguments
gc 1 @0.018s 1%: 0.008+1.8+0.025 ms clock, 0.083+0.13/2.6/1.9+0.25 ms cpu, 4->4->2 MB, 5 MB goal, 10 P
gc 2 @0.033s 1%: 0.011+1.0+0.046 ms clock, 0.11+0.58/1.7/2.6+0.46 ms cpu, 5->5->4 MB, 6 MB goal, 10 P
# command-line-arguments
gc 1 @0.003s 8%: 0.028+4.2+0.059 ms clock, 0.28+0.16/5.9/2.8+0.59 ms cpu, 4->6->5 MB, 5 MB goal, 10 P
gc 2 @0.024s 4%: 0.007+3.0+0.069 ms clock, 0.076+0.042/3.1/1.9+0.69 ms cpu, 9->9->8 MB, 10 MB goal, 10 P
gc 3 @0.134s 1%: 0.019+1.7+0.065 ms clock, 0.19+0.98/2.3/2.0+0.65 ms cpu, 16->16->9 MB, 17 MB goal, 10 P
gc 9 @1.225s 0%: 0.26+1.0+0.19 ms clock, 2.6+0.40/1.2/1.0+1.9 ms cpu, 4->4->0 MB, 5 MB goal, 10 P
gc 1 @0.001s 6%: 0.036+1.3+0.064 ms clock, 0.36+0/0.77/1.1+0.64 ms cpu, 10->10->10 MB, 11 MB goal, 10 P
gc 2 @1.004s 0%: 0.072+1.2+0.023 ms clock, 0.72+0/1.3/0+0.23 ms cpu, 20->20->0 MB, 21 MB goal, 10 P
gc 3 @2.011s 0%: 0.036+0.12+0.003 ms clock, 0.36+0/0.19/0.031+0.035 ms cpu, 10->10->0 MB, 11 MB goal, 10 P
gc 4 @3.015s 0%: 0.11+0.78+0.010 ms clock, 1.1+0/1.0/0.007+0.10 ms cpu, 10->10->0 MB, 11 MB goal, 10 P
gc 5 @4.020s 0%: 0.13+1.1+0.031 ms clock, 1.3+0/0.38/0+0.31 ms cpu, 10->10->0 MB, 11 MB goal, 10 P
gc 6 @5.022s 0%: 0.10+0.54+0.007 ms clock, 1.0+0/0.65/0+0.079 ms cpu, 10->10->0 MB, 11 MB goal, 10 P
gc 7 @6.024s 0%: 0.13+0.65+0.008 ms clock, 1.3+0/0.75/0+0.081 ms cpu, 10->10->0 MB, 11 MB goal, 10 P
gc 8 @7.027s 0%: 0.094+0.73+0.008 ms clock, 0.94+0/0.83/0+0.082 ms cpu, 10->10->0 MB, 11 MB goal, 10 P
gc 9 @8.029s 0%: 0.14+0.68+0.008 ms clock, 1.4+0/0.84/0+0.081 ms cpu, 10->10->0 MB, 11 MB goal, 10 P
gc 10 @9.031s 0%: 0.076+0.43+0.008 ms clock, 0.76+0/0.59/0+0.084 ms cpu, 10->10->0 MB, 11 MB goal, 10 P
Alloc = 0 MiB	TotalAlloc = 100 MiB	Sys = 32 MiB	NumGC = 10

这些GC日志是Go运行时在垃圾回收过程中生成的详细信息。每一行日志记录了一个GC周期的相关信息。

以下是对这些日志的详细解释:
每一行GC日志的格式如下:

gc N @T S%: M1+M2+M3 ms clock, C1+C2/C3/C4+C5 ms cpu, A->B->C MB, D MB goal, P P

字段解释

  • gc N:表示这是第N次垃圾回收。
  • @T:表示垃圾回收发生的时间点,单位是秒(s),从程序启动开始计算。
  • S%:表示垃圾回收器在总CPU时间中所占的百分比。
  • M1+M2+M3 ms clock:表示垃圾回收的三个阶段(标记、清理、其他)所花费的总时间,单位是毫秒(ms)。
    • C1+C2/C3/C4+C5 ms cpu:表示垃圾回收的各个阶段在CPU上所花费的时间,单位是毫秒(ms)。
    • C1:STW(Stop-The-World)标记开始时间。
    • C2:并发标记时间。
    • C3:并发清理时间。
    • C4:并发清理结束时间。
    • C5:STW标记结束时间。
  • A->B->C MB:表示垃圾回收前、垃圾回收后和垃圾回收过程中分配的内存量,单位是MB。
  • D MB goal:表示垃圾回收的目标内存量,单位是MB。
  • P P:表示参与垃圾回收的处理器数量。

示例解释
以下是对示例日志的详细解释:

gc 1 @0.065s 0%: 0.010+2.7+0.003 ms clock, 0.10+0.16/2.9/2.1+0.034 ms cpu, 4->4->0 MB, 5 MB goal, 10 P
* gc 1:这是第1次垃圾回收。
* @0.065s:垃圾回收发生在程序启动后的0.065秒。
* **0%**:垃圾回收器在总CPU时间中所占的百分比为0%。
* 0.010+2.7+0.003 ms clock:垃圾回收的三个阶段(标记、清理、其他)所花费的总时间分别是0.010ms、2.7ms和0.003ms。
* 0.10+0.16/2.9/2.1+0.034 ms cpu:垃圾回收的各个阶段在CPU上所花费的时间分别是0.10ms、0.16ms、2.9ms、2.1ms和0.034ms。
* 4->4->0 MB:垃圾回收前、垃圾回收后和垃圾回收过程中分配的内存量分别是4MB、4MB和0MB。
* 5 MB goal:垃圾回收的目标内存量是5MB。
* 10 P:参与垃圾回收的处理器数量是10个。

3.参考

gc-guide
runtime

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/52593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

等保测评中的安全测试方法

等保测评&#xff0c;即信息安全等级保护测评&#xff0c;是我国网络安全领域的重要评估机制&#xff0c;用于验证网络系统或应用是否满足相应的安全保护等级要求。在等保测评中&#xff0c;安全测试方法扮演着至关重要的角色。本文将详细介绍等保测评中常用的安全测试方法及其…

LinkedHashMap和TreeMap的基本使用

一.LinkedHashMap集合&#xff1a;&#xff08;是HashMap集合的儿子&#xff0c;Map集合的孙子&#xff09; 1.特点&#xff1a; 2.代码实现&#xff1a; 1)键的唯一性&#xff1a; package com.itheima.a01myMap; ​ import java.util.LinkedHashMap; ​ public class A07_…

二十三种模式之单例模式(基础了解)

1.设计模式的分类 创建型模式(五种)&#xff1a;工厂方法模式、单例模式、抽象工厂模式、原型模式、建造者模式。结构型模式(七种)&#xff1a;适配器模式、代理模式、装饰器模式、桥接模式、外观模式、享元模式、组合模式。行为型模式(十一种)&#xff1a;状态模式、模板方法…

Flamingo中的Perceiver Resampler

在 Flamingo 模型中&#xff0c;Perceiver Resampler 是一个关键组件&#xff0c;用于将输入的多模态数据&#xff08;如图像和文本&#xff09;转化为适合Transformer处理的表示形式。具体来说&#xff0c;它是为了解决高维视觉输入&#xff08;如图像&#xff09;和低维语言表…

【Docker项目实战】使用Docker部署webtop桌面版Linux环境

【Docker项目实战】使用Docker部署webtop桌面版Linux环境 一、webtop介绍1.1 webtop简介1.2 主要特点1.3 使用场景二、webtop相关说明2.2 webtop支持架构2.2 镜像版本说明三、本地环境介绍3.1 本地环境规划3.2 本次实践介绍四、本地环境检查4.1 检查Docker服务状态4.2 检查Dock…

YOLOv8目标检测部署RK3588全过程,附代码pt->onnx->rknn,附【详细代码】

目录 一、训练yolov8模型&#xff0c;得到最佳权重文件best.pt 二、pt转onnx,即best.pt->best11.onnx 1、对下载的YOLOv8代码修改 2、加入模型导出功能&#xff0c; 3、导出指令采用如下代码 三、ONNX转RKNN 四、RK3588部署 1、拷贝rknn文件到rk3588板子内 2、执行…

48.x86游戏实战-封包抓取进图call

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

使用Supervisor守护Nginx进程

supervisor是个好工具。superviosr是一个Linux/Unix系统上的进程监控工具&#xff0c;Supervisor是用Python开发的一套通用的进程管理程序&#xff0c;能将一个普通的命令行进程变为后台daemon&#xff0c;并监控进程状态&#xff0c;异常退出时能自动重启。只要在supervisor的…

递归神经网络 (RNN) 简介

文章目录 一、介绍二、什么是递归神经网络 &#xff08;RNN&#xff09;&#xff1f;三、展开递归神经网络四、训练递归神经网络五、RNN 的类型六、现实生活中的 RNN 用例七、RNN 的两个主要限制八、RNN的变体8.1 双向递归神经网络 &#xff08;BRNN&#xff09;8.2 长短期记忆…

YOLOv8改进 | 融合改进 | C2f融合Faster-GELU模块提升检测速度【完整代码 + 主要代码解析】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

240824字节笔试题复盘

测试/测试开发方向 1、用户文档测试场景 2、大根堆排列顺序 3、时间复杂度对比 4、资源分配 5、矩阵排列 6、TCP和UDP区别 7、栈 8、用例分析与选择 9、信息脱敏 10、数据库并发 11、锁 12、边界值等价类用例设计 13、信息安全与防御 14、有关复选框的测试用例 …

节省 60% 成本还能加速业务扩展,ScraperAPI 在云基础设施上的多年实践

对于流量密集型的业务来讲&#xff0c;在创业初期&#xff0c;最头疼的就是数据库的管理&#xff0c;以及大量流量带来的高额账单。然而&#xff0c;ScraperAPI 通过结合使用 DigitalOcean 的 Droplet、托管数据库、应用托管服务和 Kubernetes&#xff0c;一箭三雕&#xff0c;…

基于信号量和环形队列的生产者消费者模型

文章目录 POSIX信号量信号量接口初始化信号量销毁信号量等待信号量发布信号量 基于环形队列的生产者消费者模型单生产单消费多生产多消费 POSIX信号量 POSIX信号量和SystemV信号量作用相同&#xff0c;都是用于同步操作&#xff0c;达到无冲突的访问共享资源目的。 但POSIX可以…

接口返回结果封装

接口返回结果封装 1、错误信息枚举 package com.zhw.enums;public enum AppHttpCodeEnum {// 成功SUCCESS(200,"操作成功"),// 登录NEED_LOGIN(401,"需要登录后操作"),NO_OPERATOR_AUTH(403,"无权限操作"),SYSTEM_ERROR(500,"出现错误&quo…

K-medoids算法原理及Python实践

一、原理 K-medoids算法是一种聚类算法&#xff0c;它的原理与K-Means算法相似&#xff0c;但关键区别在于它使用数据集中的实际点&#xff08;称为medoids&#xff09;作为簇的中心点&#xff0c;而不是像K-Means那样使用簇内所有点的平均值。以下是K-medoids算法的主要原理&…

Excel 保持原序时计算组内排名

Excel某表格第1列是分组&#xff0c;第2列是日期&#xff0c;未排序。 AB1Agent IDDate of Sale2Agent107-12-20233Agent105-12-20234Agent209-12-20235Agent313-12-20236Agent214-12-20237Agent222-12-20238Agent115-12-20239Agent117-12-202310Agent213-12-202311Agent120-1…

wooyu漏洞库YYDS!!!入门之道:重现乌云漏洞库

目录 wooyun乌云漏洞库搭建 1、搭建资料 文件结构分析&#xff1a; ​编辑2、搭建过程 2.1、搭建wooyun网站 2.2、配置数据库 2.2.1、修改数据库配置文件conn.php 2.2.2、创建wooyun数据库&#xff0c;并解压数据库文件 2.2.3、连接数据库&#xff08;数据库默认连接密…

24.8.26学习心得

验证数据集&#xff08;Validation Set&#xff09;和测试数据集&#xff08;Test Set&#xff09;在机器学习和深度学习中都是非常重要的概念。它们各自有不同的用途和目的。下面详细解释两者之间的区别&#xff1a; 1. 验证数据集&#xff08;Validation Set&#xff09; 目…

计算机基础知识总结(八股文--计算机网络、操作系统、数据库、c++、数据结构与算法)

一、操作系统 0.内存管理 01.什么是虚拟内存&#xff1f;为什么需要虚拟内存&#xff1f; 虚拟内存为程序提供比实际物理内存更大的内存空间&#xff0c;同时提高内存管理的灵活性和系统的多任务处理能力。虚拟地址空间就是进程所能看到的内存空间&#xff0c;这段空间是连续…

【案例61】update driver error

问题现象 顾问在保存数据源时报“update driver error”错误&#xff0c;重启服务器&#xff0c;重启sysConfig.bat后问题依旧。 问题分析 之前碰到这类问题发现是权限的问题。所以先去检查了相关文件夹的权限。 查看控制台发现客户用的是非Administrator用户登录&#xff0…