GoLang - 有没有办法分析使用反射的代码的内存使用情况?

GoLang - Is there a way to profile memory usage of code that uses reflect?

我正在项目中使用 gocraft/web 并尝试调试一些高内存使用率。 gocraft/web 使用反射来调用处理程序。我已经设置了运行良好的 net/http/pprof 分析器,但是最大的内存块,以及我感兴趣的内存块,只显示 reflect.Value.call 作为函数。这不是很有帮助。

如何绕过 gocraft/web 正在使用反射这一事实并深入挖掘内存配置文件?

这是我看到的配置文件输出示例:

简而言之,您不能直接这样做。 reflect.Value.call 调用 reflect.call 转发到 runtime.reflectcall,后者是在运行时实现的汇编例程,例如对于 amd64,here。这绕过了探查器可以看到的内容。

你最好的选择是调用你的处理程序而不用反射并单独测试它们。

此外,使分析器能够跟踪反射调用可以说是为下一次 Go 迭代提出的可接受的更改。为此,您应该遵循 change proposal process

编辑:issue 创建。

感谢@thwd 就此提交 http://golang.org/issue/11786。这是 pprof 中的显示问题。所有数据都在那里,只是被隐藏了。您可以通过使用 -runtime 标志调用 pprof 来获取所需的数据。它还会显示您不需要的数据,但在 Go 1.6 发布之前,它应该是一个不错的解决方法。