惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

罗磊的独立博客
SecWiki News
SecWiki News
酷 壳 – CoolShell
酷 壳 – CoolShell
爱范儿
爱范儿
量子位
M
MIT News - Artificial intelligence
GbyAI
GbyAI
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
TaoSecurity Blog
TaoSecurity Blog
博客园 - 【当耐特】
H
Heimdal Security Blog
腾讯CDC
The Last Watchdog
The Last Watchdog
Security Archives - TechRepublic
Security Archives - TechRepublic
Hacker News: Ask HN
Hacker News: Ask HN
S
Schneier on Security
Microsoft Security Blog
Microsoft Security Blog
WordPress大学
WordPress大学
博客园 - 司徒正美
Recent Commits to openclaw:main
Recent Commits to openclaw:main
C
Cybersecurity and Infrastructure Security Agency CISA
S
SegmentFault 最新的问题
大猫的无限游戏
大猫的无限游戏
Application and Cybersecurity Blog
Application and Cybersecurity Blog
F
Full Disclosure
有赞技术团队
有赞技术团队
T
Tailwind CSS Blog
Engineering at Meta
Engineering at Meta
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Threatpost
月光博客
月光博客
A
Arctic Wolf
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
雷峰网
雷峰网
T
Troy Hunt's Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The Cloudflare Blog
D
DataBreaches.Net
O
OpenAI News
L
LINUX DO - 最新话题
宝玉的分享
宝玉的分享
小众软件
小众软件
V
Vulnerabilities – Threatpost
A
About on SuperTechFans
人人都是产品经理
人人都是产品经理
T
The Exploit Database - CXSecurity.com
Martin Fowler
Martin Fowler
美团技术团队
P
Privacy International News Feed

博客园 - 你看起来真的很好吃

linux系统时间管理 安装历史docker版本 OCR文本提取+NER命名实体识别 测试 深度学习-激活函数 go——make和new的区别 go——标识符的命名规范 go语言——数据类型 go语言——转义符 go开发环境安装 git使用 项目文档目录总结 鼠标连点器——python版 windows使用YOLOV5训练模型——搭建编译环境 高匿名动态IP代理获取 logging模块进行格式化输出 笔记 Django admin 添加操作记录 facenet + fiass 实现人脸识别
go——GC垃圾回收机制
你看起来真的很好吃 · 2024-09-03 · via 博客园 - 你看起来真的很好吃
  1. go语言中内存被分成几份区域,其中包括栈和堆,栈主要用于存储函数的局部变量和其他信息,他的大小在程序运行期间是固定的。堆用于存储动态分配的对象,进程中的所有线程共享一个堆区,所以需要考虑线程安全问题。
  2. 堆和栈的区别
    1. 存储方式
      • 栈是线性数据结构、采用先进后出的方式存储数据。栈通常用于存储函数的局部变量、函数的参数,栈上的存储空间是有限且固定的,由编译器和操作系统控制。
      • 堆是树型数据结构,用于动态分配和管理内存,堆内存的大小根据需要动态调整,通常比栈大,用于存储复杂的数据结构
    2. 生命周期
      • 栈中数据的生命周期与其作用域有关,当变量离开作用域时会自动回收内存。
      • 堆中数据的生命周期通常有程序员自己控制
    3. 访问速度
      • 栈中数据访问速度相对较快,因为栈是线性数据结构,内存分配是连续的。
      • 堆中数据访问速度相对慢,因为内存分配是随机的,且堆的管理需要一定的开销。
      • 为什么连续的内存分配访问速度快
        访问数据时先检查缓存中是否存在,如果不存在则在内存中查找数据。连续内存分配可以提高缓存的命中率,有效的利用缓存,随机分配的内存缓存利用率低,所以栈比堆访问速度快
    4. 分配方式
      • 栈上的内存分配是静态的,编译器在分配前就知道大小
      • 堆上的内存分配是动态的,需要在运行时根据需求进行分配
  3. 内存逃逸
    1. 目的:用于用于决定内存存放到栈中还是堆中
    2. 内存逃逸判断条件:
      1. 如果函数外部没有引用则分配到栈中
      2. 如果函数外部有引用则分配到堆中
      3. 如果栈上放不下,则放到堆中
      4. 只要是指针变量都会在堆上分配,所以对于小变量我们还是传值效率(而不是指针)更高一点
    3. 查看逃逸情况命令 go build -gcflags=-m main.go
  4. STW
  5. GC 更新过程
    1. 标记清除(Go版本 V1.3 之前)
    2. 三色标记法(Go版本 V1.5)
    3. 三色标记法+混合写屏障机制(Go版本 V1.8)

posted @ 2024-09-03 13:45  你看起来真的很好吃  阅读(67)  评论()    收藏  举报