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反射机制的实现分析——reflect.Type方法查找和调用
Golang反射机制的实现分析——reflect.Type方法查找和调用