Go 中的内存逃逸现象是什么?
- P(Processor):
P 表示处理器,它是用于执行 Goroutines 的上下文。P 可以看作是调度上下文,它保存了 Goroutines 的执行状态、调度队列等信息。P 的数量也是可以动态调整的,它不是直接与物理处理器核心对应的,
而是与运行时系统中的 Goroutines 数目和负载情况有关。
GMP 模型的工作原理如下:
当一个 Goroutine 被创建时,它会被放入一个 P 的本地队列。
当 P 的本地队列满了,或者某个 Goroutine 长时间没有被调度执行时,P 会尝试从全局队列中获取 Goroutine。
如果全局队列也为空,P 会从其他 P 的本地队列中偷取一些 Goroutines,以保证尽可能多地利用所有的处理器。
M 的数量决定了同时并发执行的 Goroutine 数目。如果某个 M 阻塞(比如在系统调用中),它的工作会被其他 M 接管。
Go 中的内存逃逸现象是什么?
内存逃逸(Memory Escape)是指一个变量在函数内部创建,但在函数结束后仍然被其他部分引用,导致变量的生命周期超出了函数的范围,从而使得该变量的内存需要在堆上分配而不是在栈上分配。
存逃逸的情况可能发生在以下几种情况:
1、当在函数内部创建一个局部变量,然后返回该变量的指针,而该指针被函数外部的代码引用时,这个局部变量会发生内存逃逸。
func createPointer() *int { x := 42
return &x // x 的内存逃逸 }
2、当将局部变量通过 channel 或 goroutine 传递给其他部分,而这些部分可能在原始函数退出后访问这个变量时,也会导致内存逃逸。
func sendData(ch chan<- *int) { x := 42
ch <- &x // x 的内存逃逸 }
3、如果在函数内部使用 new 或 make 分配的变量,即使返回的是指针,但这个指针可能被外部持有,从而导致变量在堆上分配而不是在栈上分配。
func createWithNew() *int { x := new(int) // x 的内存逃逸
return x }
全站分卷索引 · 29 卷
- 1代码随想录知识星球精华(最强八股文)第五版(Go篇))
- 2Go string 和 []byte 的区别
- 3数组和切片的区别
- 4扩容前后的Slice是一样的吗
- 5Go语言map是有序的还是无序的, 为什么
- 6go里面的map是并发安全的吗?如何并发安全
- 7Go 的错误处理和 Java 的异常处理对比
- 8介绍一下panic和recover
- 9什么是defer?有什么作用
- 10Go并发
- 11进程、线程的区别
- 12什么是go runtine
- 13Go语言中的Channel是什么, 有哪些用途,如何处理阻塞
- 14什么是互斥锁(mutex)?在什么情况下会用到它们?
- 15Mutex有几种模式
- 16goroutine什么情况会发生内存泄漏?如何避免。
- 17Go语言中GC的流程是什么
- 18Go 中的内存逃逸现象是什么?
- 19CAP 理论,为什么不能同时满足
- 20说一下 Gin 的路由怎么实现的
- 21简述slice的底层原理,和数组的区别是什么
- 22defer底层原理
- 23侵入式和非侵入式的区别
- 24goroutine与线程的区别
- 25goroutine在什么情况下会被挂起呢?
- 26GC(垃圾回收)原理 1.5版本
- 27简述Go的垃圾回收机制
- 28协程优势及其通信方式
- 29Go的内存对齐