多个协程由于竞争资源或者彼此通信而造成阻塞,不能退出。
- 申请过多的goroutine来不及释放
三、内存泄漏的分类
在Go中内存泄漏分为暂时性内存泄漏和永久性内存泄漏。
1、暂时性内存泄漏
暂时性泄漏,指的是该释放的内存资源没有及时释放,对应的内存资源仍然有机会在更晚些时候被释放,即便如此在内存资源紧张情况下,也会是个问题。这类主要是 string、slice 底层 buffer 的错误共享,导致无用数据对象无法及时释放,或者 defer 函数导致的资源没有及时释放。
- 获取长字符串中的一段导致长字符串未释放
- 获取长slice中的一段导致长slice未释放
- 获取指针切片slice中的一段
- defer 导致的内存泄漏
2、永久性内存泄漏
永久性泄漏,指的是在进程后续生命周期内,泄漏的内存都没有机会回收,如 goroutine 内部预期之外的for-loop或者chan select-case导致的无法退出的情况,导致协程栈及引用内存永久泄漏问题。
- goroutine 泄漏导致内存泄漏;
- 定时器使用不当,time.Ticker未关闭导致内存泄漏;
time.After在定时器到达时,会自动内回收。time.Ticker 钟摆不使用时,一定要Stop,不然会造成内存泄漏。
- 不正确地使用终结器(Finalizers)导致内存泄漏
三、其他不正当使用内存场景
1、大数组作为参数导致短期内内存激增
由于数组是Golang的基本数据类型,每个数组占用不同的内存空间,生命周期互不干扰,很难出现内存泄漏的情况。但是数组作为形参传输时,遵循的是值拷贝,如果函数被多次调用且数组过大时,则会导致内存使用激增。
到此这篇ifstream读取文件遇到空格被截断(ifstream获取文件长度)的文章就介绍到这了,更多相关内容请继续浏览下面的相关 推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/rfx/77193.html