逃逸分析显示通道作为泄漏参数
来源:stackoverflow
时间:2024-04-03 12:42:37 116浏览 收藏
目前golang学习网上已经有很多关于Golang的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《逃逸分析显示通道作为泄漏参数》,也希望能帮助到大家,如果阅读完后真的对你学习Golang有帮助,欢迎动动手指,评论留言并分享~
我想做的事情: 我正在尝试理解/构建一个具有三个阶段的 go 管道。第 1 阶段写入通道 a。第 2 阶段有多个 go 例程。每个go例程从channel a读取,执行一些操作并将结果写入channel bn(channel b1,b2..bn)。第 3 阶段创建了 n(=第 2 阶段中的通道总数)个 go 例程,每个 go 例程从第 2 阶段的一个 channel 读取。它基于 https://blog.golang.org/pipelines 中描述的有限并行性 p>
问题: 管道按预期工作正常,操作分布在 go 例程之间。但是当我进行逃逸分析时,发现从一个阶段发送到另一个阶段的通道参数被报告为“泄漏参数”。
代码片段: 为简单起见,我发布的代码显示了第 1 阶段通道创建,以及第 2 阶段打印从第 1 阶段通道读取的值。
package main import "fmt" func createstageone(numofjobs int) <-chan int { stageonechannel := make(chan int) go func(njobs int) { for i := 0; i < njobs; i++ { stageonechannel <- i } close(stageonechannel) }(numofjobs) return stageonechannel } // stageonechannel closes and go routine exits once njobs are completed func createstagetwo(in <-chan int, completionflag chan struct{}) { go func() { for n := range in { fmt.println("received from stage 1 channel ", n) } completionflag <- struct{}{} }() }// comes out of for loop when stage 1 channel closes and go routine also exits func main() { numofjobs := 10 stageonechannel := createstageone(numofjobs) done := make(chan struct{}) createstagetwo(stageonechannel, done) <-done }
这是逃逸分析结果
$ go build -gcflags "-m -l" # concurrentHTTP/stackoverflow ./pipeline.go:7:5: func literal escapes to heap ./pipeline.go:7:5: func literal escapes to heap ./pipeline.go:6:25: make(chan int) escapes to heap ./pipeline.go:17:5: func literal escapes to heap ./pipeline.go:17:5: func literal escapes to heap ./pipeline.go:16:21: leaking param: in ./pipeline.go:16:36: leaking param: completionFlag ./pipeline.go:19:16: "Received from stage 1 channel " escapes to heap ./pipeline.go:19:16: n escapes to heap ./pipeline.go:19:15: createStageTwo.func1 ... argument does not escape ./pipeline.go:29:14: make(chan struct {}) escapes to heap
为什么逃逸分析报告 in 和 completionflag 标志上的参数泄漏?
解决方案
所讨论的参数是引用类型的通道。它们在 createStageTwo() 创建的闭包中捕获,并且当 createStageTwo() 返回时可以继续在该闭包的 go 例程中使用。因此,它们被标记为泄漏参数。如果不是,那么它们将被放置在堆栈上,并在 main() 处理完它们后变得无效。
这并不意味着您有问题。逃逸分析不能用于检测资源泄漏,而且大多数人永远不需要使用它。 (当某些东西被放置在您不希望的 GC 堆上时,它对于解决性能问题很有用。)
(抱歉@Volker,我最初在评论中发布了我的答案,这让您的问题悬而未决。)
好了,本文到此结束,带大家了解了《逃逸分析显示通道作为泄漏参数》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!
-
502 收藏
-
502 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
139 收藏
-
204 收藏
-
325 收藏
-
477 收藏
-
486 收藏
-
439 收藏
-
357 收藏
-
352 收藏
-
101 收藏
-
440 收藏
-
212 收藏
-
143 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习