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

Go 语言里中的堆与栈

在 Go 语言里,堆和栈是内存管理的两个重要概念,它们在多个方面存在明显差异:

1. 内存分配与回收方式

    • 分配:Go 语言中,栈内存主要用于存储函数的局部变量和调用信息。当一个函数被调用时,Go 会自动为其在栈上分配一块内存空间,用于存放该函数的局部变量,这个过程由编译器和运行时系统自动完成,速度非常快。
    • 回收:当函数执行完毕返回时,栈上分配的内存会自动被回收,无需程序员手动干预。这种自动回收机制基于栈的后进先出(LIFO)特性,确保了内存的高效管理。
    • 分配:堆内存用于存储那些在函数调用结束后仍然需要存在的数据,比如通过 new 关键字或 make 函数创建的对象。当需要在堆上分配内存时,Go 的运行时系统会进行一系列操作,包括查找合适的内存块、进行内存对齐等,因此分配过程相对复杂,速度较慢。
    • 回收:堆内存的回收由 Go 的垃圾回收器(GC)负责。垃圾回收器会定期扫描堆内存,标记那些不再被引用的对象,然后将其占用的内存回收。垃圾回收的过程会消耗一定的系统资源,并且可能会导致程序出现短暂的停顿。

2. 数据存储特性

    • 存储内容:主要存储函数的局部变量、函数调用的上下文信息(如返回地址、调用者的栈指针等)。这些变量的生命周期通常与函数的执行周期相同,函数结束时,这些变量就会被销毁。
    • 数据访问:栈上的数据访问速度快,因为栈是一块连续的内存区域,并且其操作遵循后进先出的原则,使得数据的定位和访问非常高效。
    • 存储内容:存储那些需要在多个函数之间共享的数据,或者生命周期较长的数据。例如,通过 make 函数创建的切片、映射和通道等对象通常存储在堆上。
    • 数据访问:堆上的数据访问相对较慢,因为需要通过指针来间接访问,而且堆内存的布局可能比较分散,不连续。

3. 内存空间大小和限制

    • 每个 Goroutine 都有自己独立的栈空间,栈空间的初始大小是固定的,并且在运行过程中可以动态增长或收缩。不过,栈空间的大小是有限制的,如果栈空间使用超过了限制,会导致栈溢出错误(Stack Overflow)。
    • 堆内存的大小通常受限于系统的物理内存和虚拟内存空间。只要系统还有可用的内存,就可以在堆上分配新的对象。但如果堆内存使用过度,会导致系统性能下降,甚至出现内存不足的错误。

4. 数据逃逸分析

在 Go 语言中,编译器会进行逃逸分析,来决定一个变量是分配在栈上还是堆上。

  • 如果一个变量的生命周期只在函数内部,并且不会被外部引用,那么它通常会被分配到栈上。
  • 如果一个变量的生命周期超出了函数的范围,或者会被外部引用,那么它会逃逸到堆上。逃逸分析有助于优化内存使用,减少垃圾回收的压力。

示例代码说明

package mainfunc stackVariable() {// 这个变量会分配在栈上,因为它的生命周期只在函数内部num := 10println(num)
}func heapVariable() *int {// 这个变量会逃逸到堆上,因为它的指针被返回,生命周期超出了函数范围num := new(int)*num = 20return num
}func main() {stackVariable()result := heapVariable()println(*result)
}

在上述代码中,stackVariable 函数中的 num 变量会分配在栈上,而 heapVariable 函数中通过 new 创建的 num 变量会逃逸到堆上

相关文章:

Go 语言里中的堆与栈

在 Go 语言里,堆和栈是内存管理的两个重要概念,它们在多个方面存在明显差异: 1. 内存分配与回收方式 栈 分配:Go 语言中,栈内存主要用于存储函数的局部变量和调用信息。当一个函数被调用时,Go 会自动为其…...

云计算实训室解决方案(2025年最新版)

一、中高职及本科院校在云计算专业建设中面临的挑战 随着大数据、信息安全、人工智能等新兴信息技术产业的快速发展,相关领域人才需求激增,许多本科及职业院校纷纷开设云计算及相关专业方向。 然而,大多数院校在专业建设过程中面临以下困难&…...

我的新书《青少年Python趣学编程(微课视频版)》出版了!

🎉 激动人心的时刻来临啦! 🎉 小伙伴们久等了,我的第一本新书 《青少年Python趣学编程(微课视频版)》 正式出版啦! 📚✨ 在这个AI时代,市面上的Python书籍常常过于枯燥&…...

网络安全要学python 、爬虫吗

网络安全其实并不复杂,只是比普通开发岗位要学习的内容多一点。无论是有过编程基础还是零基础的都可以学习的。网络安全目前可就业的岗位从技术上可分为两部分:web安全和二进制逆向安全。web安全是网络安全的入门方向,内容简单,就…...

DBSCAN 基于密度的空间带噪聚类法

DBSCAN 基于密度的空间带噪聚类法 DBSCAN(Density - Based Spatial Clustering of Applications with Noise)即基于密度的空间聚类算法,它是一种典型的密度聚类算法,以下从核心概念、算法步骤、优缺点及应用场景等方面进行解释。…...

Spring Security,servlet filter,和白名单之间的关系

首先,Servlet Filter是Java Web应用中的基础组件,用于拦截请求和响应,进行预处理和后处理。它们在处理HTTP请求时处于最外层,可以执行日志记录、身份验证、授权等操作。白名单机制通常指允许特定IP、用户或请求通过的安全策略&…...

深入理解Java反射机制 —— 构建灵活、动态的后端应用

一、引言 在Java后端开发中,反射机制是一项极具威力的技术。它允许程序在运行时动态加载类、调用方法以及访问属性,从而使得代码具有更高的灵活性和扩展性。本文将从反射的基本原理、核心API、实际应用场景到使用时的注意事项,详细探讨如何在…...

Python基于Django的漏洞扫描系统【附源码、文档说明】

博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...

或非门组成的SR锁存器真值表相关问题

PS:主要是给大家抛砖引玉,不喜勿喷。 问题描述:或非门组成的SR锁存器,为什么当SD和RD等于0时候的真值表一个是Q0,Q0.一个结果是Q1,Q1?...

深度学习框架探秘|TensorFlow vs PyTorch:AI 框架的巅峰对决

在深度学习框架中,TensorFlow 和 PyTorch 无疑是两大明星框架。前面两篇文章我们分别介绍了 TensorFlow(点击查看) 和 PyTorch(点击查看)。它们引领着 AI 开发的潮流,吸引着无数开发者投身其中。但这两大框…...

如何测试和验证CVE-2024-1430:Netgear R7000 路由器信息泄露漏洞分析

CVE-2024-1430 是一个影响 Netgear R7000 路由器的安全漏洞,漏洞来源于该路由器 Web 管理界面的信息泄露问题。攻击者通过访问 /currentsetting.htm 文件,可能泄露敏感信息,如 Wi-Fi 密码等。 在测试和验证 CVE-2024-1430 时,您需…...

MongoDB 基本操作

一、数据库操作 1. 切换或创建数据库 使用use命令切换到指定数据库,若该数据库不存在,在首次插入数据时会自动创建。 use myDatabase 2. 查看所有数据库 使用show dbs命令查看 MongoDB 实例中的所有数据库。 show dbs 3. 删除当前数据库 使用db.…...

【前端框架】Vue3 面试题深度解析

本文详细讲解了VUE3相关的面试题,从基础到进阶到高级,分别都有涉及,希望对你有所帮助! 基础题目 1. 简述 Vue3 与 Vue2 相比有哪些主要变化? 答案: 响应式系统:Vue2 使用 Object.definePrope…...

springboot中使用log4j2

安装依赖pom.xml <!--排除logback的依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><exclusions><exclusion><groupId>org.springframework.boot</…...

GRN前沿:DGCGRN:基于有向图卷积网络的基因调控网络推理

1.论文原名&#xff1a;Inference of gene regulatory networks based on directed graph convolutional networks 2.发表日期&#xff1a;2024 DGCGRN框架 中心节点和节点的构建 局部增强策略 1. 问题背景 在基因调控网络中&#xff0c;许多节点的连接度较低&#xff08;即…...

DeepSeek崛起:中国AI产业的颠覆者与重构者

当DeepSeek以"中国版ChatGPT"的标签横空出世时&#xff0c;这个诞生于杭州的AI新贵仅用三个月时间就完成了从行业黑马到颠覆者的蜕变。其开源大模型DeepSeek-R1在HuggingFace开源大模型排行榜的登顶&#xff0c;不仅意味着技术指标的超越&#xff0c;更预示着中国AI产…...

E. Exposition

题目链接&#xff1a;Problem - E - Codeforces 题目大意&#xff1a; 给你一个长度为n的序列&#xff0c;和一个整数k.现让找出所有连续的最长子区间&#xff0c; 其子区间的条件是&#xff1a;在区间里最大值减去最小值之差要小于 k . 输入&#xff1a; 输入数据的第一行包…...

KVM虚拟化快速入门,最佳的开源可商用虚拟化平台

引言 在信息技术飞速发展的时代&#xff0c;服务器资源的高效利用成为企业关注的焦点。KVM 虚拟化作为一种先进的虚拟化技术&#xff0c;在众多虚拟化方案中脱颖而出&#xff0c;为企业实现服务器资源的优化配置提供了有效途径。 以往&#xff0c;物理服务器的资源利用效率较…...

unity删除了安卓打包平台,unityhub 还显示已经安装,怎么解决

解决问题地址 可能由于版本问题文章中这个我没搜到&#xff0c;应该搜Android Build Supprot...

软件工程-软件设计

包括 从管理的观点看包括&#xff1a; 详细设计 概要设计 从技术的观点看包括&#xff1a; 数据设计&#xff08;详细设计&#xff09; 系统结构设计&#xff08;概要设计&#xff09; 过程设计&#xff08;详细设计&#xff09; 任务 分析模型——》设计模型——》设…...

【Viper】配置格式与支持的数据源与go案例

Viper 是一个用于 Go 应用程序的配置管理库&#xff0c;支持多种配置格式和数据源。 安装依赖 go get github.com/spf13/viper go get github.com/spf13/viper/remote go get go.etcd.io/etcd/client/v3"github.com/spf13/viper/remote"要写在etcd客户端import里 1…...

C++ Primer 参数传递

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…...

数据结构 day06

数据结构 day06 6. 双向链表6.3. 双向循环链表 7. 树 tree7.1. 特点7.1.1. 什么是树7.1.2. 树的特性7.1.3. 关于树的一些术语 7.2. 二叉树7.2.1. 什么是二叉树7.2.2. 二叉树的性质7.2.3. 满二叉树和完全二叉树的区别7.2.4. 二叉树的遍历&#xff08;画图&#xff09;7.2.5. 二叉…...

AI编程01-生成前/后端接口对表-豆包(或Deepseek+WPS的AI

前言: 做过全栈的工程师知道,如果一个APP的项目分别是前端/后端两个团队开发的话,那么原型设计之后,通过接口文档进行开发对接是非常必要的。 传统的方法是,大家一起定义一个接口文档,然后,前端和后端的工程师进行为何,现在AI的时代,是不是通过AI能协助呢,显然可以…...

01什么是DevOps

在日常开发中&#xff0c;运维人员主要负责跟生产环境打交道&#xff0c;开发和测试&#xff0c;不去操作生产环境的内容&#xff0c;生产环境由运维人员操作&#xff0c;这里面包含了环境的搭建、系统监控、故障的转移&#xff0c;还有软件的维护等内容。 当一个项目开发完毕&…...

力扣100. 相同的树(利用分解思想解决)

Problem: 100. 相同的树 文章目录 题目描述思路Code 题目描述 思路 题目要求判断两个二叉树是否完全相同&#xff0c;而此要求可以利用问题分解的思想解决&#xff0c;即判断当前节点的左右子树是否完全相同&#xff0c;而在二叉树问题分解的一般题目中均会带有返回值&#xff…...

【深度学习模型分类】

深度学习模型种类繁多&#xff0c;涵盖了从基础到前沿的多种架构。以下是主要模型的分类及代表性方法&#xff1a; 1. 基础模型 1.1 多层感知机&#xff08;MLP&#xff09; 特点&#xff1a;全连接神经网络&#xff0c;适用于结构化数据。 应用&#xff1a;分类、回归任务…...

el-select 设置宽度 没效果

想实现下面的效果&#xff0c;一行两个&#xff0c;充满el-col12 然后设置了 width100%,当时一直没有效果 解决原因&#xff1a; el-form 添加了 inline 所以删除inline属性 即可...

chrome://version/

浏览器输入&#xff1a; chrome://version/ Google浏览器版本号以及安装路径 Google Chrome131.0.6778.205 (正式版本) &#xff08;64 位&#xff09; (cohort: Stable) 修订版本81b36b9535e3e3b610a52df3da48cd81362ec860-refs/branch-heads/6778_155{#8}操作系统Windows…...

反向代理块sjbe

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…...