内存分析器
GoLand 会收集并可视化 CPU 分析、跟踪和堆分析数据。 为了收集所有必要的数据,GoLand 使用了 pprof 包。 GoLand 包含四种分析器,您可以通过用户界面运行它们:CPU、内存、阻塞(争用)和互斥锁。
性能分析结果有助于定位性能问题,但代码优化必须手动完成。 有关更多信息,请参阅 go.dev 上的 Profiling 及 pkg.go.dev 上对 pprof 包的介绍。
分析完成后,分析器会在报告中可视化显示结果。
在开始之前
在运行性能分析前,请确保:
本主题中的所有示例可在 GitHub 上的示例项目中找到。
内存分析
内存分析器可衡量程序在执行过程中是如何分配和使用内存的。 它可帮助您识别过度的内存分配、内存泄漏以及低效的数据结构。
示例程序
以下程序演示了低效的内存使用方式。 该程序在每次迭代中创建新的切片,而不是重复使用已存在的缓冲区:
运行该程序。 尽管程序很快完成,但它在堆上分配了多个对象。
创建用于分析的测试
要分析内存使用情况,请创建一个单元测试来调用 InefficientAppend 函数:
运行内存分析
请打开 _test.go 文件。
单击测试函数旁边边距中的 运行 图标。
请选择 使用 Memory Profiler 进行性能分析。

分析内存分析结果
GoLand 以三种视图展示内存分析数据:
火焰图 :显示函数调用以及为每次调用分配了多少内存。 每个块表示堆栈中的一个函数。 Y 轴显示堆栈深度(自下而上),X 轴表示堆栈分析,按内存消耗(空间和对象数量)从高到低排序。
分析火焰图时,请注意大型对象会增加内存使用量和垃圾回收时间,过多的小型分配会减缓执行速度。 这两种情况都值得进一步调查。
在 火焰图 选项卡中,将鼠标悬停在任意块上以查看详细信息。
调用树 :可视化函数如何分配内存,以及每个过程占总内存使用量的百分比。 此视图有助于识别应用程序中占用内存最多或分配对象最多的部分。 要配置并筛选 调用树 视图,请单击 表示设置 按钮
。
方法列表 :列出按分配对象数量排序的方法。 反向跟踪 选项卡显示所选方法被调用的位置, 合并的被调用方 选项卡显示所有起始于该方法的调用轨迹。 被调用方列表 是汇总调用层次结构中所有方法的方法列表。
优化并比较结果
为减轻堆压力,请重复使用单个缓冲区或预分配内存,而不是反复创建新切片。 以下是对相同代码进行优化后的版本:
当重新运行内存分析器时,火焰图显示分配大幅减少,总体堆使用量降低,表明预分配可以减少内存开销。
