当前位置: 首页 > wzjs >正文

做外汇可以参考的网站深圳网络推广外包公司

做外汇可以参考的网站,深圳网络推广外包公司,网站上的文章做参考文献,自己做网站2008R2好还是win7文章目录 浅析 Golang 内存管理栈(Stack)堆(Heap)堆 vs. 栈内存逃逸分析内存逃逸产生的原因避免内存逃逸的手段 内存泄露常见的内存泄露场景如何避免内存泄露?总结 浅析 Golang 内存管理 在 Golang 当中,堆…

文章目录

  • 浅析 Golang 内存管理
    • 栈(Stack)
    • 堆(Heap)
    • 堆 vs. 栈
    • 内存逃逸分析
      • 内存逃逸产生的原因
      • 避免内存逃逸的手段
    • 内存泄露
      • 常见的内存泄露场景
      • 如何避免内存泄露?
      • 总结

浅析 Golang 内存管理

在这里插入图片描述
在 Golang 当中,堆(Heap)和栈(Stack)是内存管理的两个核心区域,它们的用途、生命周期和管理方式有显著区别。

栈(Stack)

特点

  • 自动分配/释放:由编译器管理,无需开发者干预;
  • 高效:内存分配仅需移动栈指针;
  • 线程/协程私有:每一个 Goroutine 有自己独立的栈,可动态扩缩容;
  • 生命周期:与函数调用相绑定,函数返回时自动回收。

栈上保存的对象

  • 局部变量:函数内定义的普通变量(非指针、接口、逃逸对象);
  • 函数参数和返回值;
  • 值类型的临时变量;

逃逸分析
如果对象的引用逃逸到函数外部(如返回值是一个指针,或是函数当中的值被全局对象引用等),编译器会将其分配到堆上。

func escape() *int {x := 42 // x 逃逸到堆上(因为返回了指针)return &x
}

可通过 go build -gcflags="-m" 查看分析逃逸结果。

堆(Heap)

特点

  • 动态分配:运行时通过 GC 管理,存在分配和回收开销;
  • 共享访问:堆上的对象可以被多个 Goroutine 或函数引用;
  • 生命周期:由 GC 决定,当对象不可达时被回收。

堆上保存的对象
1)显式分配内存的对象:

p := new(int)    // 通过 new 分配在堆上
s := make([]int, 10) // 动态切片(底层数组在堆上)
m := make(map[string]int) // 映射(堆上)

2)逃逸对象:局部函数的返回值是指针或局部函数当中的局部变量被全局变量所引用。

func createUser() *User {u := User{Name: "Alice"} // 结构体逃逸到堆上return &u
}

3)大对象:超过栈容量限制的变量,比如大数组。
4)闭包捕获的变量:

func closure() func() {x := 42 // x 被闭包捕获,分配在堆上return func() { fmt.Println(x) }
}

5)接口和指针的动态类型:

var i interface{} = 42	// 接口背后的动态值可能分配在堆上

堆 vs. 栈

特性
管理方式由编译器管理运行时 GC 管理
速度极快(直接操作栈指针)较慢
线程安全每个 Goroutine 的栈空间独立全局共享
生命周期随函数调用结束自动回收由 GC 决定
适用对象小对象、短生命周期、未逃逸的局部变量大对象、逃逸对象(局部函数返回值为指针)、共享对象(局部函数创建的局部变量被全局变量引用)

内存逃逸分析

Golang 当中的内存逃逸指的主要是本应该被分配在栈上的对象,由于外部引用或生命周期延长,而不得不被分配到堆上。内存逃逸会增加 GC 的压力,进而影响到程序的性能。

内存逃逸产生的原因

1)对象被外部引用:

  • 函数返回局部变量的指针:由于 Golang 当中每个函数有自己的栈空间,函数当中新建的局部变量会优先分配到栈上,而当函数返回时,栈也会随之被销毁。如果函数返回的是局部变量的指针,为了确保局部变量不随着栈的销毁而被清除,它会被分配到堆上,从而产生了内存逃逸。
  • 被局部变量或包外引用:产生内存逃逸的原因同上,由于局部函数当中的局部变量被包外引用,那么为了确保该变量不随着函数返回时栈空间的销毁而被清除,需要被分配在堆上。

2)对象被闭包捕获:

  • 函数闭包捕获的变量会逃逸到堆上,原因是函数闭包指的是局部函数的返回值是另一个函数,函数返回后主函数的栈会被销毁,为了确保闭包函数仍然能使用主函数当中的变量,需要把被闭包捕获的变量分配到堆上。

3)动态类型或接口赋值:

  • 接口背后的动态值可能逃逸,原因在于接口类型在运行时的具体类型是不确定的。如果一个函数的返回值是接口值,由于返回值可能是指针,因此接口类型的变量应该分配在堆上。

4)栈空间不足时:

  • 超过栈容量的对象(比如大数组)会直接被分配到堆上。

5)反射或底层操作:

  • 使用 reflectunsafe 包可能导致逃逸分析失效。

避免内存逃逸的手段

  1. 减少指针暴露,比如将局部函数的返回值变为值类型;
  2. 避免返回局部变量的引用;
  3. 控制变量的作用域;
  4. 避免不必要的接口或反射;
  5. 利用编译器优化:通过 -gcflags="-m" 分析逃逸。

在 Geektutu 的博客上给出了一个「传值 vs. 传指针」的建议,在此也一并学习一下。

传值会拷贝整个对象,而传指针只传递对象的地址。传指针可以减少值的拷贝,但是会导致内存分配逃逸到堆中,增加 GC
的负担。在对象频繁创建和删除的场景下,传指针会导致 GC 开销变大从而影响性能。

一般情况下,对于需要修改原对象的值,或是占用内存较大的结构体,选择传指针。对于只读的占用内存较小的结构体,直接传值会获得更好的性能。

内存泄露

此处需要区分一个与「内存逃逸」名字非常像的概念,也就是「内存泄露」。二者有一定的关系,但本质上是不同的概念。内存泄露指的是程序在运行过程中未能正确释放不再使用的内存,导致堆内存持续增长(堆内存全局共享),最终可能耗尽系统资源。而内存逃逸指的是本应该分配在栈上的内存因为某种原因(比如被全局对象所引用,或局部变量被函数闭包捕获,或是返回值是地址)逃逸到了堆上。

常见的内存泄露场景

1)Goroutine 泄漏:指的是协程无法退出(如未关闭的 channel、死循环、阻塞 I/O 等)。

func leaky_goroutine_example() {ch := make(chan int)go func() {val := <- ch		// goroutine 阻塞地等待外部调用者传入一个值到 channel 当中fmt.Println(val)}()// ... ... ...// ⬆️ 如果最终没有值传入到 ch 当中, 那么之前启动的 goroutine 会一直阻塞, 导致内存泄漏
}

2)全局 mapslice 或缓存未清理旧的数据,导致旧数据一直占据着堆内存。

3)未关闭的资源:比如文件、数据库连接、HTTP 响应体未关闭。一个比较好的习惯是在打开这些资源之后紧跟一个 defer,确保资源被关闭。

4)循环引用。

如何避免内存泄露?

1)避免 Goroutine 泄漏:

  • 使用 context 控制 Goroutine 退出,通常与 select 相结合;
  • 确保 channel 被正确关闭,或有值写入。

2)使用 defer 及时释放资源。

3)HTTP 响应体必须关闭。

4)定期清理全局的 map 或使用 sync.Map

5)使用工具检测内存泄露:

  • pprof 监控内存使用;
  • runtime.ReadMemStats 检查内存增长。

总结

  • 内存逃逸是编译器行为,具体指的就是因为某些原因,本应该分配在栈上的内存逃逸到了堆上,内存逃逸会增加 GC 压力,但是没有内存泄露的风险;
  • 内存泄露是代码逻辑问题,需要手动优化(如积极使用 defer 关闭资源、使用 context 控制 goroutine 生命周期,使用 pprof 监控内存以避免长期运行的服务耗尽系统资源)。
http://www.dtcms.com/wzjs/480204.html

相关文章:

  • 做网站要怎么找单网络商城应该如何推广
  • 直播网站如何做域名查询注册信息查询
  • 网站建设打造微信加人推码35一单
  • 兰州市城乡建设局网站s104项目seo工具优化软件
  • 美国疫情都是假的抖音seo源码搭建
  • 淘宝装修做代码的网站美区下载的app怎么更新
  • 毕设代做的网站市场营销推广策略
  • 网站建设实习报告范文郑州网站优化顾问
  • 怎么做单位网站竞价推广招聘
  • 龙口建设网站qq群引流推广平台
  • 西安市住房和城乡建设局企业网站优化服务
  • 网站建设需求文档模版怎么样做推广最有效
  • 开发软件网站建设合肥网络推广培训学校
  • 做网站mac网站优化seo教程
  • 修改网站需要什么搜索引擎是网站吗
  • 河北省建设环境备案网站西安网络推广外包公司
  • 建设信基金管理有限公司网站百度网络营销推广
  • 周口网站建设.com站长统计app进入网址新版
  • 网站的营销方式有哪些购物网站有哪些
  • 上海专业网站建设电商seo是什么意思
  • 重庆做网站 哪个好些嘛站长收录平台
  • wordpress 做网站百度问答兼职怎么做
  • wordpress 嵌套评论专业网站优化公司
  • 沈阳做网站优化人工智能教育培训机构排名
  • 江门市住房和城乡建设局门户网站石家庄网络营销网站推广
  • 国内做心理咨询师培训出名的网站外贸网站平台都有哪些
  • 成都企业模版网站建设青岛网站建设策划
  • 成都网站优化软件百度竞价广告代理
  • 南平企业网站建设职业培训热门行业
  • 做网站好比做房子seo平台优化