gpt4 book ai didi

performance - 如何分析golang的内存?

转载 作者:IT老高 更新时间:2023-10-28 12:58:08 25 4
gpt4 key购买 nike

我写了一个 golang 程序,它在运行时使用 1.2GB 内存。

调用 go tool pprof http://10.10.58.118:8601/debug/pprof/heap 会导致仅使用 323.4MB 堆的转储。

  • 剩余的内存使用情况如何?
  • 有没有更好的工具来解释 golang 运行时内存?

使用 gcvis 我明白了:

enter image description here

.. 和这个堆表单配置文件:

enter image description here

这是我的代码:https://github.com/sharewind/push-server/blob/v3/broker

最佳答案

堆配置文件显示事件内存,即运行时认为 go 程序正在使用的内存(即:尚未被垃圾收集器收集)。当 GC 确实收集内存时,配置文件会缩小,但不会将内存返回给系统。在向系统询问更多之前,您 future 的分配将尝试使用先前收集的对象池中的内存。

从外部看,这意味着您的程序的内存使用量将增加或保持不变。外部系统呈现为程序的“驻留大小”的是分配给程序的 RAM 字节数,无论它是保存使用中的 go 值还是收集的值。

这两个数字经常相差很大的原因是:

  1. GC收集内存对程序的外观没有影响
  2. 内存碎片
  3. 只有在上一次 GC 后使用的内存是使用内存的两倍时才会运行 GC(默认情况下,请参见:http://golang.org/pkg/runtime/#pkg-overview)

如果您想准确了解 Go 如何查看内存,您可以使用 runtime.ReadMemStats 调用:http://golang.org/pkg/runtime/#ReadMemStats

或者,由于您正在使用基于 Web 的分析,如果您可以通过浏览器访问分析数据:http://10.10.58.118:8601/debug/pprof/,请单击堆链接将向您显示堆配置文件的调试 View ,该 View 在底部打印出 runtime.MemStats 结构。

runtime.MemStats 文档 (http://golang.org/pkg/runtime/#MemStats) 对所有字段进行了解释,但本次讨论中有趣的是:

  • HeapAlloc:本质上是分析器为您提供的(事件堆内存)
  • Alloc:类似于 HeapAlloc,但适用于所有托管内存
  • Sys:从操作系统请求的内存总量(地址空间)

Sys 和操作系统报告的内容之间仍然存在差异,因为 Go 对系统的要求与操作系统给它的内容并不总是相同的。 go 也不会跟踪 CGO/syscall(例如:malloc/mmap)内存。

关于performance - 如何分析golang的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24863164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com