← 返回目录

Go 中的内存逃逸现象是什么?

第 18 / 29 卷日期:

  1. 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. 1代码随想录知识星球精华(最强八股文)第五版(Go篇))
  2. 2Go string 和 []byte 的区别
  3. 3数组和切片的区别
  4. 4扩容前后的Slice是一样的吗
  5. 5Go语言map是有序的还是无序的, 为什么
  6. 6go里面的map是并发安全的吗?如何并发安全
  7. 7Go 的错误处理和 Java 的异常处理对比
  8. 8介绍一下panic和recover
  9. 9什么是defer?有什么作用
  10. 10Go并发
  11. 11进程、线程的区别
  12. 12什么是go runtine
  13. 13Go语言中的Channel是什么, 有哪些用途,如何处理阻塞
  14. 14什么是互斥锁(mutex)?在什么情况下会用到它们?
  15. 15Mutex有几种模式
  16. 16goroutine什么情况会发生内存泄漏?如何避免。
  17. 17Go语言中GC的流程是什么
  18. 18Go 中的内存逃逸现象是什么?
  19. 19CAP 理论,为什么不能同时满足
  20. 20说一下 Gin 的路由怎么实现的
  21. 21简述slice的底层原理,和数组的区别是什么
  22. 22defer底层原理
  23. 23侵入式和非侵入式的区别
  24. 24goroutine与线程的区别
  25. 25goroutine在什么情况下会被挂起呢?
  26. 26GC(垃圾回收)原理 1.5版本
  27. 27简述Go的垃圾回收机制
  28. 28协程优势及其通信方式
  29. 29Go的内存对齐