GoLand 2026.1 Help

内存分析器

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

性能分析结果有助于定位性能问题,但代码优化必须手动完成。 有关更多信息,请参阅 go.dev 上的 Profilingpkg.go.dev 上对 pprof 包的介绍

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

在开始之前

在运行性能分析前,请确保:

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

  • GoLand 已 安装在您的计算机上。

  • 您希望分析的 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 轴表示堆栈分析,按内存消耗(空间和对象数量)从高到低排序。

    分析火焰图时,请注意大型对象会增加内存使用量和垃圾回收时间,过多的小型分配会减缓执行速度。 这两种情况都值得进一步调查。

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

  • 调用树 :可视化函数如何分配内存,以及每个过程占总内存使用量的百分比。 此视图有助于识别应用程序中占用内存最多或分配对象最多的部分。 要配置并筛选 调用树 视图,请单击 表示设置 按钮 “显示设置”按钮

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

优化并比较结果

为减轻堆压力,请重复使用单个缓冲区或预分配内存,而不是反复创建新切片。 以下是对相同代码进行优化后的版本:

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

当重新运行内存分析器时,火焰图显示分配大幅减少,总体堆使用量降低,表明预分配可以减少内存开销。

InefficientAppend
2026年 3月 26日