Go 语言逃逸分析:内存管理的关键

2024-05-24 23:44

本文主要是介绍Go 语言逃逸分析:内存管理的关键,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 1 逃逸分析是什么?
  • 2 逃逸分析的基本思想是什么?
  • 3 逃逸分析的分配原则是什么?
  • 4 如何进行逃逸分析?
  • 5 逃逸分析案例
    • 5.1 变量在函数外存在引用
    • 5.2 引用类型的逃逸
    • 5.3 闭包捕获变量
    • 5.4 变量占用内存较大
  • 6 变量会逃逸到堆上的原因有哪些?
  • 7 如何避免逃逸?
  • 8 逃逸分析的作用有哪些?
  • 9 学习交流

前言

在正式学习逃逸分析时,我们需要提前补充变量的声明周期的概念。


  • 栈(stack):在GO语言中,栈是调用栈(call stack) 的简称。在GO程序运行时,每一个Goroutine单独维护一个自己的栈区仅允许自己使用不能被其他Goroutine使用。一个栈通常包含许多栈帧(stack frame),它描述的是函数之间的调用关系。栈的内存是由编译器自动进行分配释放的。栈区主要存储函数参数局部变量调用函数帧,它们随函数的创建而分配随函数的退出而销毁
  • 堆(heap):与栈(stack)不同的是,堆区的内存是由编译器工程师共同负责管理分配,交给Runtime GC释放。在堆上分配内存时,必须找到一块足够大的内存来存放新的变量数据。在堆上释放内存时,垃圾回收器会扫描内存空间中不被使用的对象并释放其内存。在我们开发过程中,其实考虑内存管理,主要是考虑堆内存的管理。

变量的声明周期与变量作用域的关系

  • 全局变量:它的生命周期与程序的生命周期一致
  • 局部变量:它的生命周期是动态的,从变量创建开始,到变量不再使用结束。
  • 形参和函数的返回值:它们都是属于局部变量,在函数被调用时创建,调用结束时被销毁。

1 逃逸分析是什么?

逃逸分析(Escape Analysis)是一种重要的编译时优化技术,决定将变量分配到 堆(heap)上 还是 栈(stack)上
通过逃逸分析,编译器可以判断变量的生命周期作用范围,从而选择最合适的内存分配方式,以提高程序的性能和减少内存开销


2 逃逸分析的基本思想是什么?

[!warning]- 思考: 如何知道GO变量的生命周期是完全可知的?

  • 判断变量是值类型还是引用类型,值类型是确定的完全可知的,引用类型是不可知的,不知道是否该变量被其他函数使用。
  • 检查变量的生命周期是否是完全可知的,如果是,则在栈上分配内存。
  • 如何检查不是完全可知的,也就是我们说的逃逸,必须在堆上分配内存。

3 逃逸分析的分配原则是什么?

[!warning]- 如何确定参数类型是不确定的?

  • 变量的数据类型采用interface{},编译期无法确定其具体的参数类型,所以分配到堆中。
  • 什么样的数据类型是确定的? 比如:声明了一个确定数据类型int的变量`var num int
  • GO的逃逸分析是在编译期间完成的,编译期间无法确定的参数类型是放在堆中的。
  • 变量在函数外存在引用,则必定放在
  • 变量占用内存较大,则优先放在
  • 变量在函数外部没有引用,则优先放在中。

4 如何进行逃逸分析?

逃逸分析我们可以通过命令查看结果,-gcflags选项用于向 Go 编译器传递编译标志。这些标志可以用来启用或禁用特定的编译器功能,包括逃逸分析

  • 查看基本的逃逸分析和内联信息,适用于一般情况
go build -gcflags="-m" main.go

[!warning]+ 命令解释说明

  • -m:表示输出有关内联(inlining)逃逸分析的信息

  • 查看更详细的优化信息和逃逸分析结果,并禁用内联优化,适用于需要深入调试和分析的情况。
go build -gcflags '-m -m -l'  main.go

[!warning]+ 命令解释说明

  • -m -m:表示多次使用 -m 标志,增加详细程度,会输出更多的优化信息,包括逃逸分析和内联优化的详细信息。
  • -l:表示禁用内联优化。

5 逃逸分析案例

5.1 变量在函数外存在引用

package mainimport "fmt"func createPointer() *int {var x intreturn &x  // x 逃逸到堆上
}func main() {p := createPointer()fmt.Println(*p)
}

[!note]+ 代码解析说明

  • 函数 createPointer 返回了局部变量 x 的地址,这意味着 x 在函数返回后仍然需要存在。
  • 因此,编译器将 x 分配到堆上,并在逃逸分析的输出中提示 &x escapes to heap

5.2 引用类型的逃逸

  • 例如:切片、映射、接口等引用类型的变量,如果它们的底层数据逃逸,则这些变量也会逃逸。
func createSlice() []int {s := make([]int, 10) return s // s 逃逸到堆上 
}

5.3 闭包捕获变量

如果闭包捕获了外部变量,该变量会逃逸到堆上。

func createClosure() func() { var x int return func() { x++ // x 逃逸到堆上 }
}

5.4 变量占用内存较大

func createManySlice() []int {  var s []int  for i := 0; i < 1000; i++ {  s = make([]int, 10)  }  return s // s 逃逸到堆上  
}

6 变量会逃逸到堆上的原因有哪些?

  • 函数返回值:如果返回一个局部变量的指针或引用,该变量会逃逸到堆上。
  • 闭包捕获:如果闭包捕获了外部变量,该变量会逃逸到堆上。
  1. 长生命周期:如果变量的生命周期超出了其作用域,如通过指针或引用传递给其他函数或存储在全局变量中。

7 如何避免逃逸?

避免逃逸,也就是说减少不必要的堆分配。

  • 避免返回局部变量的指针或引用
  • 尽量减少闭包捕获的外部变量
  • 使用值传递而不是指针传递

8 逃逸分析的作用有哪些?

  • 提升内存分配效率:栈上分配比在堆上分配效率更高效,栈上的内存可以自动回收,而堆上的内存需要垃圾回收器管理。
  • 减少垃圾回收开销:减少不必要的堆分配,可以降低垃圾回收的频率和开销。
  • 提高程序性能:优化内存分配,提升程序运行效率。

9 学习交流

为了方便大家一起学习一起进步,我创建了一个学习交流的平台
感兴趣的朋友们可以加我微信:LH913582934,备注:CSDN。

这篇关于Go 语言逃逸分析:内存管理的关键的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/999873

相关文章

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

衡石分析平台使用手册-单机安装及启动

单机安装及启动​ 本文讲述如何在单机环境下进行 HENGSHI SENSE 安装的操作过程。 在安装前请确认网络环境,如果是隔离环境,无法连接互联网时,请先按照 离线环境安装依赖的指导进行依赖包的安装,然后按照本文的指导继续操作。如果网络环境可以连接互联网,请直接按照本文的指导进行安装。 准备工作​ 请参考安装环境文档准备安装环境。 配置用户与安装目录。 在操作前请检查您是否有 sud