教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Golang 内存泄漏场景

Golang 内存泄漏场景

发布时间:2022-03-25   编辑:jiaochengji.com
教程集为您提供Golang 内存泄漏场景等资源,欢迎您收藏本站,我们将为您提供最新的Golang 内存泄漏场景资源
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"/></svg>

虽然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内存的浪费

<pre><code>func f(s1 string) { s0 = (" " s1[:50])[1:] } </code></pre> <h2>
Not Resetting Pointers in Lost Slice Elements</h2> <pre><code>func h() []*int { s := []*int{new(int), new(int), new(int), new(int)} // do something with s ... return s[1:3:3] } </code></pre>

由于返回的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 泄露

[关闭]
~ ~