有没有办法知道谁在Go中拥有对象的引用?

时间:2018-01-29 10:56:07

标签: debugging go memory-leaks

我目前正在尝试调试our Go code中令人讨厌的内存泄漏。

我所知道的:

  • 内存在哪里(pprof-base标志)
  • 为什么要分配新内存("重新连接"我们的代码中的功能)
  • goroutines的数量没有增长(runtime.NumGoroutine()
  • 如果我object = nil,内存将被垃圾收集(好!但现在我与其他使用此对象的go-routines进行数据竞争)

我不知道的事情:

  • 为什么新内存不被垃圾收集。为此,我需要知道谁拥有对象的引用。

感谢您的时间和任何建议!

2 个答案:

答案 0 :(得分:1)

我可以建议两种工具。

使用Go Guru,查看谁指向或引用了一个指针。它与我使用的vim-go插件集成在一起,我在该here上发表了一篇文章。

Valgrind是用于C / C ++的工具,但找到​​了一篇有关将其与Go一起使用的文章。

答案 1 :(得分:0)

找不到您的代码404。

当您放置object = nil时。并没有立即清除它,但是当某些goroutine仍然保留它时,即使gc运行,该对象也将保持静止。

您问谁持有引用,使用该val而不将其设置为nil的goroutine或goroutine在循环中使用它的都将保留引用。

gc()永远不会将引用的参考标记为黑色,因此永远不会清除