goroutine泄露:原理、场景、检测和防范_go goroutine 泄露的场景-程序员宅基地

技术标签: 内存泄露  golang  go  

如果你启动了一个 goroutine,但并没有符合预期的退出,直到程序结束,此goroutine才退出,这种情况就是 goroutine 泄露。当 goroutine 泄露发生时,该 goroutine 的栈(一般 2k 内存空间起)一直被占用不能释放,goroutine 里的函数在堆上申请的空间也不能被 垃圾回收器 回收。这样,在程序运行期间,内存占用持续升高,可用内存越来也少,最终将导致系统崩溃。

回顾一下 goroutine 终止的场景:

  • 当一个goroutine完成它的工作
  • 由于发生了没有处理的错误
  • 有其他的协程告诉它终止

那么当这三者同时没发生的时候,就会导致 goroutine 始终不会终止退出。

goroutine 泄露的场景

goroutine泄露一般是因为channel操作阻塞而导致整个routine一直阻塞等待或者 goroutine 里有死循环的时候。可以细分为下面五种情况:

1. 从 channel 里读,但是没有写
// leak 是一个有 bug 程序。它启动了一个 goroutine 阻塞接收 channel。当 Goroutine 正在等待时,leak 函数会结束返回。此时,程序的其他任何部分都不能通过 channel 发送数据,那个 channel 永远不会关闭,fmt.Println 调用永远不会发生, 那个 goroutine 会被永远锁死

func leak() {
   
    
     ch := make(chan int)

     go func() {
   
    
        val := <-ch
        fmt.Println("We received a value:", val)
    }()
}
2. 向 unbuffered channel 写,但是没有读
// 一个复杂一点的例子
func sendMsg(msg, addr string) error {
   
    
    conn, err := net.Dial("tcp", addr)
    if err != nil {
   
    
        return err
    }
    defer conn.Close()
    _, err = fmt.Fprint(conn, msg)
    return err
} 

func broadcastMsg(msg string, addrs []string) error {
   
    
    errc := make(
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/leeright/article/details/94466831

智能推荐

Error processing condition on org.springframework.cloud.netflix.eureka.server.EurekaServer..错误-程序员宅基地

文章浏览阅读2.7w次,点赞5次,收藏3次。java.lang.IllegalStateException: Error processing condition on org.springframework.cloud.netflix.eureka.server.EurekaServerAutoConfiguration.peerEurekaNodes。。。。 找到的解决办法:改为:即可。..._error processing condition on org.springframework.cloud.netflix.eureka.eurek

Android Studio官方文档:如何构建简单的用户界面_androidstudio实现新建联系人简单界面-程序员宅基地

文章浏览阅读2.3w次,点赞3次,收藏8次。在本课中,您将学习如何创建一个 XML 格式的布局,其中包含一个文本字段和一个按钮。在下一课中,在按下此按钮时,您的应用会将文本字段的内容发送给另一个 Activity 作为响应。Android 应用的图形界面使用View 对象和ViewGroup 对象层次结构而构建。View对象通常为按钮或文本字段之类的UI 小部件。而ViewGroup对象则为不可见的视图容器,它们定义子视图的布局_androidstudio实现新建联系人简单界面

STM32虚拟COM端口驱动程序STSW-STM32102 V1.5.0_stm32 virtual comport 驱动 1.5-程序员宅基地

文章浏览阅读5.2k次。描述Compatible with the x86 and x64 platformsThe STSW-STM32102 software package contains four installation files based on the various versions of the Microsoftoperating system.OS versions prior to Windows7 are compatible with the Windows7 installat..._stm32 virtual comport 驱动 1.5

python读取grib文件_Windows下Python读取GRIB数据-程序员宅基地

文章浏览阅读955次。之前写了一篇《基于Python的GRIB数据可视化》的文章,好多博友在评论里问我Windows系统下如何读取GRIB数据,在这里我做一下说明。一、在Windows下Python为什么无法读取GRIB大家在windows系统不能读取GRIB数据的主要原因是,GRIB_API在Windows下无法编译安装,从而导致pygrib安装失败。我曾经也为这个问题苦恼了很久,也到ECMWF论坛里找了很久,也给E..._py grib

Week3 互评作业:用“埃氏筛法”求2~100以内的素数。java实现_week3互评作业查看帮助返回 用“埃氏筛法”求2~100以内的素数。2~100以内的数,-程序员宅基地

文章浏览阅读803次。问题描述用“埃氏筛法”求2~100以内的素数。2~100以内的数,先去掉2的倍数,再去掉3的倍数,再去掉5的倍数,……依此类推,最后剩下的就是素数。要求使用数组及增强的for语句。提示:可以使用一个boolean类型的数组,所以“将某个数i去掉”,可以表示成a[i]=false。当然也可以使用其他方法。java实现public class problem1 { //素数:在大于1的自然数中,除了1和他本身,不能被其他数整除 public static void main(String[] a_week3互评作业查看帮助返回 用“埃氏筛法”求2~100以内的素数。2~100以内的数,

glassfish java环境_java – 如何修改GlassFish中的Web环境条目4-程序员宅基地

文章浏览阅读49次。在我的web.xml中,我的webapp应用程序我有以下元素:aMessagejava.lang.StringHello World这个Web应用程序中的EJB可以读取它:final InitialContext context = new InitialContext();final Context env = (Context) context.lookup("java:comp/env");..._glassfish 修改java

随便推点

史上最强 Tomcat8 性能优化实战!-程序员宅基地

文章浏览阅读450次。作者:ThinkWon链接:blog.csdn.net/ThinkWon/java/article/details/102744033文章目录目的服务器资源Tomcat配置优化 L..._"

C++之多线程_c++线程百度网盘-程序员宅基地

文章浏览阅读258次。多线程//C++参考秒杀多线程系列 多线程笔试面试题汇总 ---- //主要 讲解详细C++ 多线程 面试题详解C++多线程编程之常见面试问题 C++ 11 多线程–线程管理程序员的自我修养(五):C++ 多线程编程初步..._c++线程百度网盘

国产FPGA那家强_国产fpga 哪家好-程序员宅基地

文章浏览阅读3.9w次,点赞6次,收藏29次。国产FPGA那家强写了这么多FPGA的文章却从来没有涉及过国产FPGA,很多网友甚至不知道还有国产FPGA。下面列举一些国产FPGA,排名不分先后,标题只是噱头。内容如有侵权,请联系小编进行删除。1 西安智多晶微电子有限公司西安智多晶微电子有限公司总部位于西安,北京设立有EDA软件研究中心。目前已实现55nm、40nm工艺中密度FPGA的量产,并针对性推出了内嵌Flash、SDRAM等集成化..._国产fpga 哪家好

HTML5情人节送花烟花动画表白代码网页版情人节表白代码祝有情人终成眷属-程序员宅基地

文章浏览阅读461次,点赞11次,收藏10次。【代码】HTML5情人节送花烟花动画表白代码网页版情人节表白代码祝有情人终成眷属。

多目标优化_多目标优化转化为单目标优化-程序员宅基地

文章浏览阅读3.9k次。多目标优化_多目标优化转化为单目标优化

oracle两个表数据比较,oracle数据库两表数据比较-程序员宅基地

文章浏览阅读1.3w次。1 引言在程序设计的过程中,往往会遇到两个记录集的比较。如华东电网PMS接口中实现传递一天中变更(新增、修改、删除)的数据。实现的方式有多种,如编程存储过程返回游标,在存储过程中对两批数据进行比较等等。本文主要讨论利用ORACLE的MINUS函数,直接实现两个记录集的比较。2 实现步骤假设两个记录集分别以表的方式存在,原始表为A,产生的比较表为B。2.1 判断原始表和比较表的增量差异利用MINUS..._oracle数据对比语句

推荐文章

热门文章

相关标签