golang内存逃逸分析

一、概述

        golang 内存分配的位置由编译决定,不像c或c++ 使用malloc/new 就能在堆上分配内存。内存逃逸是指:当一个对象的指针被多个方法或线程引用时,我们称这个指针发生了逃逸。

二、golang内存分配基本原则

  • 当函数外部对指针没有引用时,优先分配在上。
  • 当函数外部对指针存在引用时,优先分配在上。
  • 当函数内分配一个较大对象时,优先分配在上。

三、golang如何内存逃逸分析

在go build 时加上-gcflags "-m",就会对所有函数中的所有对象进行内存逃逸分析,分析结果直接显示在终端上。

四、为什么进行内存逃逸分析

1.分配在堆上:分配与释放操作都存在较大开销,可能出现内存碎片,且过多的内存分配在堆上会加重GC负担。

2.分配在栈上:cpu只需要简单的“PUSH”和“RELEASE”指令即可完成内存的分配与释放。

五、go几种内存逃逸场景

1.指针逃逸:对象i被分配到堆上。

package main

func test() *int {
	i := 0
	return &i
}

func main() {
	test()
}

        

2.大对象分配: s被分配到栈上

package main

func stack() {
	s := make([]int, 100000, 100000)
	s[0] = 1
}

func main() {
	stack()
}

3.动态类型逃逸

package main

func dynamic() interface{} {
	i := 0
	return i
}

func main() {
	dynamic()
}

4.闭包逃逸:a、b 都逃到堆上

package main

import "fmt"

func fibonacci() func() int {
	a, b := 0, 1
	return func() int {
		a, b = b+a, a+b
		return a
	}
}

func main() {
	f := fibonacci()
	fmt.Println(f())
	fmt.Println(f())
}

参考文献

        Golang内存逃逸分析_zhanglehes的博客-CSDN博客

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Go语言中,内存逃逸指的是当一个对象的指针被多个方法或线程引用时,这个指针会逃逸到上。内存逃逸的位置由编译器决定,而不像C或C++可以使用malloc或new在分配内存。根据内存分配的基本原则,当函数外部对指针没有引用时,优先分配在栈上;当函数外部对指针存在引用时,优先分配上;当函数内部分配一个较大对象时,优先分配上。\[1\] 在Go语言中,内存逃逸分析可以通过一些规则来判断。例如,当使用等号=赋值时,如果Data和Field都是引用类型的数据,则会导致Value逃逸。另外,一些特定的数据类型也会导致逃逸,比如\[\]interface{}、map\[string\]interface{}、map\[interface{}\]interface{}、map\[string\]\[\]string、map\[string\]*int、\[\]*int、func(*int)、func(\[\]string)、chan \[\]string等。具体的规则可以参考引用\[2\]中的示例。\[2\] 此外,栈空间不足也可能导致内存逃逸。当在函数中创建一个较大的切片或数组,并且栈空间不足以容纳它们时,这些切片或数组会逃逸到上。例如,在一个函数中创建一个长度为10000的切片,如果栈空间不足,这个切片就会逃逸到上。\[3\] 总结来说,内存逃逸是指当一个对象的指针被多个方法或线程引用时,这个指针会逃逸到上。在Go语言中,内存逃逸的位置由编译器决定,可以通过一些规则和栈空间的判断来进行分析。 #### 引用[.reference_title] - *1* [golang内存逃逸分析](https://blog.csdn.net/qq_42170897/article/details/127770234)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [golang内存逃逸](https://blog.csdn.net/wanghao3616/article/details/107284523)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [golang——内存逃逸机制](https://blog.csdn.net/weixin_45627369/article/details/127163797)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值