【go基础】9.内存分配, 内存逃逸, 栈空间
在Go语言中,内存分配主要发生在以下几种情况:
- 使用
new
关键字,分配内存,返回指针。 - 声明一个变量,如果是复杂类型(例如struct),会在堆上分配内存。
- 对于slice,map,和channel,它们的内部结构可能会在运行时动态变化,因此需要在堆上分配。
内存逃逸是指一个变量在它应该被销毁的时候,仍然被其他线程或者goroutine所引用,导致它不能被垃圾回收。在Go中,可以通过以下方式避免内存逃逸:
- 使用
sync.Mutex
或其他同步机制来保护共享变量,避免跨 goroutine 的数据竞争。 - 使用
channel
来传递数据,而不是通过全局变量或参数传递指针。
栈空间是指函数调用时在调用栈上分配的内存空间,用于存储函数内的局部变量、指针等。栈空间是自动管理的,不需要手动释放,当函数执行完毕,栈空间会自动回收。
示例代码:
package main
import (
"fmt"
"sync"
)
// 示例:避免内存泄露
func noLeak() {
var mu sync.Mutex
var data []string
mu.Lock()
data = append(data, "hello")
mu.Unlock()
// 通过channel传递data,避免内存泄露
ch := make(chan []string)
go func() {
ch <- data
}()
receivedData := <-ch
fmt.Println(receivedData)
}
func main() {
noLeak()
}
在这个例子中,我们通过一个channel
来传递数据,而不是直接返回一个指向数据的指针,这样就避免了内存泄露。
评论已关闭