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

Posted

技术标签:

【中文标题】GoLang - 有没有办法分析使用反射的代码的内存使用情况?【英文标题】:GoLang - Is there a way to profile memory usage of code that uses reflect? 【发布时间】:2015-07-14 23:53:56 【问题描述】:

我在一个项目中使用gocraft/web 并试图调试一些高内存使用情况。 gocraft/web 使用反射来调用处理程序。我已经设置了net/http/pprof 分析器,它工作得很好,但是最大的内存块,也是我最感兴趣的,只将reflect.Value.call 显示为函数。这不是很有帮助。

我怎样才能绕过gocraft/web 使用反射并深入挖掘内存配置文件的事实?

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

【问题讨论】:

您可以尝试使用 go1.5 对此进行分析吗?新运行时的一个副作用是它向分析器公开了更多内部结构。 @JimB 如果它起作用了会很棒,但不幸的是它没有。 【参考方案1】:

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

【讨论】:

【参考方案2】:

简短的回答是你不能直接。 reflect.Value.call 调用 reflect.call 转发到 runtime.reflectcall,这是在运行时实现的汇编例程,例如对于 amd64,here。这绕过了探查器可以看到的内容。

最好的办法是在不进行反射的情况下调用您的处理程序并单独测试它们。

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

编辑:issue 已创建。

【讨论】:

@cellofellow:如果您不打算提出更改,请告诉我,我可以这样做。 继续提出建议 :)

以上是关于GoLang - 有没有办法分析使用反射的代码的内存使用情况?的主要内容,如果未能解决你的问题,请参考以下文章

golang反射常见用法

Golang反射机制的实现分析——reflect.Type方法查找和调用

Golang反射机制的实现分析——reflect.Type方法查找和调用

GoLang反射

Golang反射机制的实现分析——reflect.Type类型名称

Golang反射机制的实现分析——reflect.Type类型名称