GoLand 2025.3 Help

内存分析器

GoLand 收集并可视化 CPU 分析、跟踪与堆分析数据。 为了收集所有必要的数据,GoLand 使用了 pprof 包。 GoLand 包含四种分析器,您可以通过用户界面运行它们:CPU、内存、阻塞(争用)和互斥锁。

分析结果可帮助您定位性能问题,但代码优化需手动实现。 有关更多信息,请参阅 go.dev 上的 Profiling 以及 pkg.go.dev 上 pprof 软件包的描述

分析完成后,分析器会在报告中可视化结果。

在开始之前

在运行分析之前,请确保:

  • Go 已安装,您可以使用 GOROOT 文章来安装、升级或配置 Go。 欲了解更多信息,请参阅 GOROOT

  • GoLand 已在您的计算机上 installed

  • 您要分析的 Go 项目已在 IDE 中打开。

本主题中的所有示例都可在 GitHub 上的示例项目 中找到。

内存分析

内存分析器会衡量程序在执行过程中如何分配和使用内存。 它可帮助您识别过度的内存分配、内存泄漏以及低效的数据结构。

示例程序

以下程序展示了低效的内存使用情况。 它在每次迭代中都创建了一个新的切片,而不是重用已有缓冲区:

package main func EfficientAppend(n int) []int { result := make([]int, 0, n) for i := 0; i < n; i++ { result = append(result, i) } return result } func InefficientAppend(n int) []int { result := []int{} for i := 0; i &lt; n; i++ { tmp := []int{i} // new slice created in each loop iteration result = append(result, tmp...) } return result } func main() { InefficientAppend(10_000_000) EfficientAppend(10_000_000) }

运行该程序。 虽然执行速度很快,但该程序会在堆上分配许多对象。

创建分析测试

要分析内存使用情况,请创建一个调用 InefficientAppend 函数的单元测试:

package main import "testing" func TestInefficientAppend(t *testing.T) { InefficientAppend(10_000_000) } func TestEfficientAppend(t *testing.T) { EfficientAppend(10_000_000) }

运行内存分析

  1. 请打开 _test.go 文件。

  2. 点击测试函数旁边边栏中的 运行 图标。

  3. 请选择 使用 Memory Profiler 进行分析

    InefficientAppend

分析内存分析结果

GoLand 以三种视图展示内存分析数据:

  • 火焰图 :显示函数调用以及为每次调用分配的内存量。 每个块表示堆栈中的一个函数。 Y 轴表示调用堆栈深度(自下而上),X 轴表示调用堆栈分析结果,按内存消耗最多(空间和对象数量)到最少的函数排序。

    分析火焰图时,请注意大型对象会增加内存使用情况和垃圾回收时间,而大量小分配则会降低执行速度。 这两种情况都值得调查。

    火焰图 选项卡中,将鼠标悬停在任意块上可查看详细信息。

  • 调用树 :可视化函数如何分配内存,并显示每个过程所占的内存使用情况百分比。 此视图有助于识别应用中使用最多内存或分配最多对象的部分。 要配置并筛选 调用树 视图,请点击 表示设置 按钮 Presentation Settings 按钮

  • 方法列表 :按分配对象数量对方法进行排序并列出。 反向跟踪 选项卡显示所选方法的调用位置, 合并的被调用方 选项卡显示从所选方法发起的所有调用跟踪。 被调用方列表 是汇总调用层次结构中所有方法的方法列表。

优化并比较结果

为减轻堆压力,请重用单个缓冲区或预先分配内存,而非重复创建新的切片。 以下是经过优化的相同代码版本:

func EfficientAppend(n int) []int { result := make([]int, 0, n) for i := 0; i < n; i++ { result = append(result, i) } return result }

重新运行内存分析器时,火焰图显示的分配次数明显减少,总堆使用量也有所降低,从而证实预分配能够降低内存开销。

InefficientAppend
最后修改日期: 2025年 12月 5日