【Golang】火焰图空白部分是什么?

server/2024/9/24 8:41:41/

起因

被同事灵魂拷问:图中这块空白是什么东西?
在这里插入图片描述

豆包回答说是数据采样不完整,特定函数或代码段未被调用之类的原因,感觉都不太合理。
之前看过一篇文章说:Heap Profiling的采样是无时无刻不在发生的,执行一次profiling仅仅是dump一下迄今为止的数据快照。这篇文章更加推翻了前面"数据采样不完整"的假设。那火焰图中的空白到底是啥,我们亲自试一下。

实验

参考:使用火焰图对 Go 程序进行性能分析

实验设计

在一个函数中调用另外的函数,在多种位置申请内存,查看火焰图的空白情况。

前置准备

  1. 安装环境
  2. 编写测试代码
  3. 在Goland中运行测试代码,可以通过 pprof 的 HTTP 接口访问http://localhost:8000/debug/pprof/heap?debug=1
  4. 在终端中执行以下命令,在页面中展示火焰图。其中,-http=":8081"表示用于查看火焰图的端口,http://localhost:8000/debug/pprof/heap表示采集的数据源。需要注意,每次运行此命令时,生成的是当前堆快照,如果代码有变更,或者想要获取最新结果,需要中断后重新运行此命令。
    go tool pprof -http=":8081" http://localhost:8000/debug/pprof/heap
  5. 火焰图分析方法:选择VIEW - Flame Graph (old)后,再选择SAMPLE - alloc_space。我们主要看这个,其它的选项也可以参考。
    在这里插入图片描述

函数调用关系

func allocate1() {allocate2()allocate3()
}

代码1:allocate1本身占用空间

package mainimport ("net/http"_ "net/http/pprof""time"
)func allocate1() {var s []stringfor i := 0; i < 10000; i++ {// allocate1占用的空间for i := 0; i < 10; i++ {s = append(s, "This is a sample string")}// allocate2占用的空间allocate2()// allocate3占用的空间allocate3()}
}func allocate2() {var s []stringfor i := 0; i < 10; i++ {s = append(s, "This is a sample string")}
}
func allocate3() {var s []stringfor i := 0; i < 10; i++ {s = append(s, "This is a sample string")}
}func main() {go func() {for {allocate1()time.Sleep(1 * time.Second)}}()http.ListenAndServe(":8000", nil)
}

生成的火焰图:
在这里插入图片描述

代码2:allocate本身不占空间

把13-15行注释掉,让allocate1不占空间

package mainimport ("net/http"_ "net/http/pprof""time"
)func allocate1() {//var s []stringfor i := 0; i < 10000; i++ {// allocate1占用的空间//for i := 0; i < 10; i++ {// s = append(s, "This is a sample string")//}// allocate2占用的空间allocate2()// allocate3占用的空间allocate3()}
}func allocate2() {var s []stringfor i := 0; i < 10; i++ {s = append(s, "This is a sample string")}
}
func allocate3() {var s []stringfor i := 0; i < 10; i++ {s = append(s, "This is a sample string")}
}func main() {go func() {for {allocate1()time.Sleep(1 * time.Second)}}()http.ListenAndServe(":8000", nil)
}

生成的火焰图:
在这里插入图片描述

结论

当allocate1本身占用空间的时候,火焰图中的空白存在。当allocate1本身不占用空间的时候,火焰图被填满,不存在空白。说明空白的部分是上一级函数内部对象占用的空间。


http://www.ppmy.cn/server/102830.html

相关文章

HttpUtils工具类(一)常见的HttpUtils工具类及如何自定义java的http连接池

目录 一、几种常见的Http调用方式 1. 使用 Apache HttpClient 2. 使用 OKhttpClient 3. 使用第三方库&#xff08;Hutool&#xff09;的http链接池 4. 使用 Spring RestTemplate 5. 使用 Java 原生的HttpURLConnection 二、总结 常用三种HttpUtils对比总结 一、几种常见…

MySQL的子查询

1. 子查询的基本概念 子查询是嵌套在主查询中的查询语句。主查询使用子查询的结果作为条件、过滤器或计算的一部分。子查询可以嵌套在SELECT、FROM、WHERE、HAVING和INSERT语句中。 2. 子查询的使用方法 以下是子查询在不同查询语句中的使用方法&#xff1a; 子查询作为条件…

创建干净虚拟环境对YOLOV8进行打包

背景 基于Yolov8写了一个视频检测小demo&#xff0c;考虑后续要到项目上使用&#xff0c;所以研究了一下打包流程。使用的工具是Pyinstaller&#xff0c;在原有的环境下面打包发现&#xff0c;大小有6个多G。所以想再弄一个干净的环境&#xff0c;只安装需要的模块&#xff0c…

基于web框架的协同过滤的美食推荐系统【数据爬虫、管理系统、数据可更新、样式可调整】

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍研究背景研究的目的与意义协同过滤算法基于用户的协同过滤算法定义基于物品的协同过滤算法的定义 数据库设计db_food&#xff08;美食信息表&#xff09;db_collect&#xff08;美食…

微服务设计原则——高性能:池化

文章目录 1.池化由来2.内存池3.线程池4.连接池5.对象池6.小结参考文献 1.池化由来 池化&#xff08;Pooling&#xff09;是一种优化技术&#xff0c;旨在提高系统性能和资源利用率&#xff0c;特别是在高并发环境中。通过池化&#xff0c;系统可以重用资源&#xff0c;而不是每…

java并发编程之线程基础

文章目录 线程基础线程状态New&#xff08;新创建&#xff09;Runnable&#xff08;可运行&#xff09;被阻塞线程和等待线程Terminated&#xff08;终止&#xff09; 三种使用线程的方法线程互斥同步Synchronized概念修饰的四种对象 ReentrantLock比较 线程基础 线程状态 线…

网络编程/在哪些场景中不必要进行网络字节序转换? Windows Sockets: Byte Ordering

文章目录 概述字节序必须转换字节序的的情况不必转换字节序的的情况字节序转换的例程字节序转换函数字节序转换可以不生硬字节序和位序 概述 本文主要讲述了在哪些场景下必须要进行大小端字节序转换&#xff0c;在哪些场景下可以不用进行大小端字节序转换&#xff0c;IP和端口…

【ubuntu24.04】k8s 部署6:calico容器正常启动

参考大神 以及 tigera官方的calico 教程:拥有一个带有 Calico 的单主机 Kubernetes 集群 后, 【k8s】配置calico 1: 镜像拉取 【k8s】master节点重新安装docker-ce 本文进一步解决容器启动问题: 非常感谢大神的指点:准备 Kubernetes 集群环境 做好了各种配置以后,kube**的…