首页 > 系统相关 >Go几种内存逃逸的情况

Go几种内存逃逸的情况

时间:2024-09-15 17:37:14浏览次数:10  
标签:map int go 编译器 逃逸 内存 Go main 指针

main.go

package main

import "fmt"

// 指针(任何类型的指针)、slice和map作为返回值
// 当带有指针的返回值被赋给外部变量或者作为参数传递给其他函数时, 编译器无法确定该变量何时停止使用
// 因此,为了确保安全性和正确性,它必须将该数据分配在堆上,并使其逃离当前函数作用域
func f1() (*int, []int, map[int]int) {
	i := 0
	list := []int{1, 2, 3, 4}
	mp := map[int]int{1: 1, 2: 2}
	return &i, list, mp
}

// 向chan中发送数据的指针或者包含指针的值。会//编译器此时不知道值什么时候会被接收,因此只能放入堆中J
func f2() {
	i := 2
	ch := make(chan *int, 2)
	ch <- &i
	<-ch
}

// 非直接的函数调用,比如在闭包中引用包外的值,因为闭包执行的生命周期可能会超过函数周期,因此需要放入堆中
func f3() func() {
	i := 1
	return func() {
		fmt.Println(i)
	}
}

// 在slice或map中存储指针或者包含指针的值
// sLice和map都需要动态分配内存来保存数据。当我们将一个指针或包含指针的值放入sLice或map时,
// 编译器无法确定该指针所引用的数据是否会在函数返回庙仍然被使用
// 为了保证数据的有效性,编译器会将其分配到堆上,以便在函数返回后继续存在
func f4() {
	i := 1
	list := make([]*int, 10)
	list[0] = &i
}

// interface类型多态的应用,可能会导致逃迎
// 由于按口类型可以持有任意实现了该按口的类型,编译器在编译时无法确定具体的动态类型
// 因此,为了保证程序正确性,在运行时需要将接口对象分配到堆上
func f5() {
	var a animal = dog{}
	a.run()
	var a1 animal
	a1 = dog{}
	a1.run()
}

// 由于fmt打印是interface类型
// 如果输出的内容包含指针或者channel,那么可能会发生内存泄露
func f6() {
	a := &dog{}
	fmt.Println(a)
}

type animal interface {
	run()
}
type dog struct{}

func (a dog) run() {}

执行 go build -gcflags '-m' main.go

标签:map,int,go,编译器,逃逸,内存,Go,main,指针
From: https://www.cnblogs.com/qcy-blog/p/18415455

相关文章

  • Django的高校学生信息管理系统的设计与实现-附源码02553
    摘 要本研究旨在设计和实现基于Django框架的高校学生信息管理系统,涵盖了系统用户、学生信息管理、教师信息管理、课程分类管理、开课信息管理、选课信息管理、课表信息管理、成绩信息管理、系统管理、网站公告管理和校园资讯等多个功能模块。通过系统的建立,旨在提供一个全面......
  • 项目运行内存异常问题排查
    一:通过命令排查:有的时候在生产环境是无法使用Jprofiler等工具的,我们只能借助jdk提供的相关命令进行排查top:使用Top命令排查CPU消耗很高的进程top-H-ppid:查到进程消耗的CPU很高的情况下我们可以通过以下命令来定位到那个线程消耗的CPU高转换16进制:因为java中查看线程号使用......
  • 基于django+vue店铺供应链系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着电子商务的蓬勃发展和市场竞争的日益激烈,店铺供应链系统的优化与升级成为了零售企业提升竞争力的关键。传统的供应链管理方式已难以满......
  • 基于django+vue电子招投标系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,电子化、网络化已成为各行各业转型升级的重要趋势。在招投标领域,传统的手工操作与纸质文档管理方式已难以满足高效......
  • 基于django+vue电子相册管理系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着数字技术的飞速发展,人们日常生活中拍摄的照片数量急剧增加,如何高效、有序地管理和存储这些珍贵的记忆成为了亟待解决的问题。传统的纸......
  • 基于django+vue电子商务网站的设计与实现【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和普及,电子商务已成为全球经济的重要组成部分,深刻改变着人们的消费习惯与商业模式。电子商务网站作为企业与消费......
  • Go协程及并发锁应用指南
    概念协程(Goroutine)是Go语言独有的并发体,是一种轻量级的线程,也被称为用户态线程。相对于传统的多线程编程,协程的优点在于更加轻量级,占用系统资源更少,切换上下文的速度更快,不需要像多线程编程一样处理锁等线程安全问题。1.协程的创建在Go语言中,可以使用go语句来启动一个......
  • 【开题报告】基于django+vue物流管理系统(论文+程序)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着电子商务的蓬勃发展和消费者购物习惯的转变,物流行业迎来了前所未有的发展机遇与挑战。传统的物流管理系统往往存在信息孤岛、效率低下......
  • 【Go - 超实用,3行代码实现个自增器】
    场景自增器的作用是生成一个唯一的递增序列号。这在一些需要生成自增id的场景十分有用,比如自增的订单号,任务号,序列号。要点全局统一:在整个服务体系下,多个服务或者进程,都统一调用这个自增器,来获取自增ID。严格自增:避免竞争,写冲突造成写覆盖等,导致不严格自增实现根据上面......
  • 【开题报告】基于django+vue旅游管理系统(论文+源码) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着旅游业的蓬勃发展,旅游市场的竞争日益激烈,传统的旅游管理方式已难以满足游客多元化、个性化的需求。在这个数字化时代,构建一个高效、便......