Golang 内存泄漏场景
虽然Golang 的runtime 会回收内存,但是本文列举的场景仍然会造成内存泄漏。
<h2>substrings 使用不当造成内存泄漏</h2>TODO 此处需要了解下golang 的底层 memory block 分配知识
<pre><code>var s0 string // 包级别变量 // A demo purpose function. func f(s1 string) { s0 = s1[:50] //s0 和 s1 共用相同的底层memory block // 尽管 s1 不再使用,但是 s0仍然存活状态 // 所以s1 的内存不会被回收,尽管只有 50 byte内存 // 被使用,但是其他内存都泄漏了。 } func demo() { s := createStringWithLengthOnHeap(1 << 20) // 1M bytes f(s) } </code></pre>可以用如下方式来避免:
<pre><code>func f(s1 string) { s0 = string([]byte(s1[:50])) } </code></pre>这个方法的缺点是有50字节的重复了
可以继续优化为如下方式,当然它也有1byte内存的浪费
由于返回的slice 仍然存活状态,会阻止 s中元素被回收。
<pre><code>func h() []*int { s := []*int{new(int), new(int), new(int), new(int)} // do something with s ... // Reset pointer values. s[0], s[len(s)-1] = nil, nil return s[1:3:3] } </code></pre> <h2>被goroutinue hang住的内存泄漏</h2>有时候,有些goroutinue 会永远都 hang住
为什么 go runtime 没有杀死hang住的goroutinue 一个原因是因为go routime 很难去判断一个goroutinue 是否是要永远被hang住。另外一个原因是可能是我们故意将goroutinue hang住,例如为了不面程序退出而hang住主要的goroutinue。
<h2>time.Ticker</h2>time.Ticker 应该被stop,当不再使用时候
<h2>Finalizers</h2>不恰当的使用了析构函数
https://go101.org/article/memory-leaking.html
到此这篇关于“Golang 内存泄漏场景”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!您可能感兴趣的文章:
使用pprof进行golang程序内存分析
Golang 内存泄漏场景
了解 C 语言中的指针和内存泄漏及如何避免
golang struct 字段null_给大家丢脸了,用了三年golang,我还是没答对这道内存泄漏题。...
.go语言是否存在内存泄露问题?发现go语言内存泄漏的2种方法
Java内存泄漏原理及如何防止
golang编程技巧:利用GC机制优雅地关闭协程,避免内存泄漏
JQuery1.4+ Ajax IE8 内存泄漏问题
定位分析内存泄漏的原因和后果
golang 切片截取 内存泄露_怎么看待Goroutine 泄露