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

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