golang gctrace分析gc过程
时间:2022-07-25
本文章向大家介绍golang gctrace分析gc过程,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
golang/gc
三色标记法
(1)、有黑白灰三个集合。初始时所有对象都是白色。
(2)、从Root对象开始标记(协程栈, 全局对象等), 将所有可达对象标记为灰色。
(3)、从灰色对象集合取出对象, 将其引用的对象标记为灰色, 放入灰色集合, 并将自己标记为黑色。
(4)、重复第三步, 直到灰色集合为空, 即所有可达对象都被标记。
(5)、标记结束后, 不可达的白色对象即为垃圾。对内存进行迭代清扫, 回收白色对象。
(6)、重置GC状态。
使用gctrace分析gc的实际情况
Golang,自带gc,在不改动代码的情况下,我们可以设置GODEBUG='gctrace=1'环境变量启动程序,来向标准错误输出打印,查看gc 是否有异常:
GODEBUG=gctrace=1 go test . -run=^$ -bench=BenchmarkLeak -benchtime 20s -test.memprofile=mem.profile -benchmem
gc 66 @2.988s 3%: 0.076+9.7+0.015 ms clock, 1.2+38/37/0.11+0.24 ms cpu, 313->321->160 MB, 323 MB goal, 16 P
gc 67 @3.047s 3%: 0.054+9.8+0.067 ms clock, 0.87+4.0/37/33+1.0 ms cpu, 310->319->162 MB, 321 MB goal, 16 P
gc 68 @3.110s 3%: 0.12+8.9+0.041 ms clock, 2.0+6.3/33/36+0.66 ms cpu, 315->322->160 MB, 325 MB goal, 16 P
gc 69 @3.173s 3%: 0.061+8.9+0.033 ms clock, 0.97+46/35/0+0.53 ms cpu, 313->320->161 MB, 321 MB goal, 16 P
gc 70 @3.232s 3%: 0.065+9.4+0.004 ms clock, 1.0+10/36/36+0.078 ms cpu, 311->321->163 MB, 322 MB goal, 16 P
gc 71 @3.294s 3%: 0.10+9.8+0.030 ms clock, 1.7+18/38/27+0.49 ms cpu, 317->325->164 MB, 327 MB goal, 16 P
gc 42: 表示第42次GC,共有16个P (线程)参与GC。
@3.294s: @后面的数字表示程序启动经历的时间.
3%: 表示gc 占时间比。
0.10+9.8+0.030 ms: STW(stop-the-world)0.11ms, 并发标记和扫描的时间9.8ms, STW标记的时间0.030ms。
1.7+18/38/27+0.49 ms cpu, 表示垃圾回收占用cpu时间
317->325->164 MB: 表示堆的大小,gc后堆的大小,存活堆的大小
327 MB goal 表示整体堆的大小为327M。
- 欧盟推出“数字经济税收制度”优化了税收制度,却影响区块链行业
- CSS魔法堂:你一定误解过的Normal flow
- ASP.NET输出JSON格式数据
- haproxy 新手上路
- 区块链是如何保护交易隐私的?eprint这篇论文告诉你答案
- gradle项目中资源文件的相对路径打包处理技巧
- Markdown 语法手册 (完整整理版)
- WordPress3.5安装出现的几个问题
- java并发编程学习: 原子变量(CAS)
- gradle项目中如何支持java与scala混合使用?
- 开始使用Linux
- .Net魔法堂:开启IIS的WebGarden、WebFarm和StateServer之旅
- java中的tuple实现
- MYSQL5.7开启慢查询日志
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Laravel自动生成UUID,从建表到使用详解
- Python中Selenium库使用教程详解
- 浅谈laravel aliases别名的原理
- Yii2框架中一些折磨人的坑
- php获取是星期几的的一些常用姿势
- laravel 实现用户登录注销并限制功能
- PHP Swoole异步Redis客户端实现方法示例
- PHP全局使用Laravel辅助函数dd
- 在laravel中实现ORM模型使用第二个数据库设置
- laravel5.1 ajax post 传值_token示例
- Laravel框架处理用户的请求操作详解
- Laravel实现ORM带条件搜索分页
- Laravel等框架模型关联的可用性浅析
- laravel5.6中的外键约束示例
- Yii框架核心组件类实例详解