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

golang入门笔记——内存管理

文章目录

  • 自动内存管理
      • 概念
      • 自动内存管理-相关概念:
      • 追踪垃圾回收:
      • 分代GC(Generational GC)
      • 引用计数
  • 内存分配
      • Go内存分配-分块
      • Go内存分配——多级缓存
    • Go内存管理优化
      • Balanced GC

自动内存管理

概念

1.动态内存

程序在运行时根据需求动态分配的内存:malloc()

2.自动内存管理(垃圾回收):由程序语言的运行时系统回收动态内存

避免手动内存管理,专注于实现业务逻辑保证内存使用的正确性和安全性:double-free problem,use-after-free problem

3.三个任务

 为新对象分配空间找到存活对象回收死亡对象的内存空间

自动内存管理-相关概念:

	 Mutator:业务线程,分配新对象,修改对象指向关系Collector:GC线程,找到存活对象,回收死亡对象的内存空间Serial GC:只有一个collectorParallel GC:支持多个collectors同时回收的GC算法

Concurrent GC:mutator(s)和collector(s)可以同时执行
collectors必须感知对象指向关系的改变

在这里插入图片描述

在这里插入图片描述 评价GC算法

	1.安全性:不能回收存活对象(基本要求)2.吞吐率:1-(GC时间)/程序执行总时间花在GC上的时间3.暂停时间:业务是否感知4.内存开销:GC元数据开销

两种常见的GC技术:

	1.追踪垃圾回收2.引用计数

追踪垃圾回收:

对象被回收的条件:指针指向关系不可达的对象
步骤(根据对象的生命周期,使用不同的标记和清理策略):
1.标记根对象
静态变量、全局变量、常量、线程栈等
2.标记可达对象
求指针指向关系的传递闭包:从根对象出发,找到所有可达对象
3.清理所有不可达对象
将存活对象复制到另外的内存空间(Copying GC)
将死亡对象的内存标记为“可分配” (Mark-sweep GC)
移动并整理存活对象 (Mark-compact GC)

在这里插入图片描述
如何选择策略:

分代GC(Generational GC)

分代假说(Generational hypothesis):most objects die young

Intuition:很多对象在分配出来后很快就不再使用了

每个对象都有年龄:经历过GC的次数

目的:对年轻和老年的对象,制定不同的GC策略,降低整体内存管理的开销

不同年龄的对象处于heap的不同区域
在这里插入图片描述
年轻代(Young generation)

	常规的对象分配由于存活对象很少,可以采用copying collectionGC吞吐率很高

老年代(Old generation)

	对象趋向于一直活着,反复重复开销较大可以采用mark-sweep collection

引用计数

在这里插入图片描述
每个对象都有一个与之关联的引用数目
对象存活的条件:当且仅当引用数大于0
优点:

	内存管理的操作被平摊到程序执行过程中内存管理不需要了解runtime的实现细节:c++智能指针

缺点:

	维护引用计数的开销较大:通过原子操作保证对引用计数操作的原子性和可见性无法回收环形数据结构内存开销:每个对象都引入了额外内存空间存储引用数目回收内存时依然可能引发暂停

在这里插入图片描述

内存分配

Go内存分配-分块

目标:为对象在heap上分配内存

	提前将内存分块1.调用系统调用mmap()向OS申请一大块内存,例如4MB2.先将内存划分成大块,例如8KB,称作mspan3.再将大块继续划分成特定大小的小块,用于对象分配4.noscan mspan:分配不包含指针的对象——GC不需要扫描5.scan mspan:分配包含指针的对象——GC需要扫描对象分配:根据对象的大小,选择最合适的块返回

Go内存分配——多级缓存

TCMalloc:Thread caching
每个p包含一个mcache用于快速分配,用于为绑定于p上的g分配对象
mcache管理一组mspan
当mcache中的mspan分配完毕,向mcentral申请带有未分配块的mspan
当mspan中没有分配的对象,mspan会被缓存在mcentral中,而不是立刻释放并归还给OS

在这里插入图片描述

Go内存管理优化

1.对象分配是非常高频的操作:每秒分配GB级别的内存
2.小对象占比较高
3.内存分配比较耗时

	分配路径长:g->m->p->mcache->mspan->memory block->return pointerpprof:对象分配的函数是最频繁调用的函数之一

Balanced GC

每个g都绑定一大块内存(1KB),称作goroutine allocation buffer(GAB)
GAB用于noscan类型的小对象分配:<128B
使用三个指针维护GAB:base,end,top
Bump pointer(指针碰撞)风格对象分配无须和其他分配请求互斥分配动作简单高效

在这里插入图片描述
在这里插入图片描述
注意:

1.GAB对于Go内存管理来说是一个大对象
2.本质:将多个小对象的分配合并成一次大对象的分配
3.问题:GAB的对象分配方式会导致内存被延迟释放

在这里插入图片描述
在这里插入图片描述
问题的解决方案:移动GAB中存活的对象

	当GAB总大小超过一定阈值时,将GAB中存活的对象复制到另外分配的GAB中原先的GAB可以释放,避免内存泄漏本质:用copying GC的算法管理小对象

在这里插入图片描述

相关文章:

golang入门笔记——内存管理

文章目录自动内存管理概念自动内存管理-相关概念&#xff1a;追踪垃圾回收&#xff1a;分代GC&#xff08;Generational GC&#xff09;引用计数内存分配Go内存分配-分块Go内存分配——多级缓存Go内存管理优化Balanced GC自动内存管理 概念 1.动态内存 程序在运行时根据需求…...

97. 约数之和

Powered by:NEFU AB-IN Link 文章目录97. 约数之和题意思路代码97. 约数之和 题意 假设现在有两个自然数 A和 B&#xff0c;S是 A^B的所有约数之和。 请你求出 S mod 9901的值是多少。 思路 ABA^BAB的约数之和为&#xff1a;sumAB(1p1p12...p1Ba1)(1p2p22...p2Ba2)...sum_{A^B…...

想和20岁的自己说

男生床头千万不要放卫生纸不要叫自己的女朋友早睡&#xff0c;更不能叫她早起&#xff0c;否则有你好受的。成年人的默契&#xff1a;和异性单独出去旅游&#xff0c;如果没有明确拒绝开一间房&#xff0c;那基本上默认后面会发生的事情不要去考验人性&#xff0c;世上99%的人经…...

Unit Test and Integration Test

Unit Test and Integration Test Background It is the first time that I try to write an article in English. In the past, I didn’t write test code. Just thinking QA is responsible for testing. As a developer, I don’t need to care about tests. Although I …...

2022年全国职业院校技能大赛(中职组)网络安全竞赛试题(3)

目录 模块A 基础设施设置与安全加固 &#xff08;本模块20分&#xff09; 一、项目和任务描述&#xff1a; 假定你是某企业的网络安全工程师&#xff0c;对于企业的服务器系统&#xff0c;根据任务要求确保各服务正常运行&#xff0c;并通过综合运用用户安全管理与密码策略、…...

智慧城市应急指挥中心数字化及城市驾驶舱建设方案

目 录 第一章 项目概述 1.1 项目背景 1.2 项目范围 第二章 建设内容 2.1 三维可视化平台 2.1.1 多源数据接入 2.1.2 可视化编排 2.1.3 三维可视化编辑 2.1.4 空间数据可视化 2.1.5 集成框架支持 2.2 可视化场景定制开发 2.2.1 城市驾驶总舱 2.2.2 城市安全分舱 2.…...

HSCSEC 2023 个人练习

&#x1f60b; 大家好&#xff0c;我是YAy_17&#xff0c;是一枚爱好网安的小白。本人水平有限&#xff0c;欢迎各位大佬指点&#xff0c;欢迎关注&#x1f601;&#xff0c;一起学习 &#x1f497; &#xff0c;一起进步 ⭐ 。⭐ 此后如竟没有炬火&#xff0c;我便是唯一的光。…...

Android 基础知识4-2.7 RelativeLayout(相对布局)

一、RelativeLayout的概述 RelativeLayout&#xff08;相对布局&#xff09;是一种根据父容器和兄弟控件作为参照来确定控件位置的布局方式。在很多时候&#xff0c;线性布局还不能满足我们的需求&#xff0c;比如&#xff0c;我们在一行&#xff08;列&#xff09;上显示多个控…...

关于云计算,我们问了ChatGPT 10个问题

ChatGPT懂云计算吗&#xff1f;前些天&#xff0c;我们问了ChatGPT&#xff08;非Plus收费版&#xff09;一些问题。1. 什么是云计算&#xff1f;2. 云计算行业的护城河是什么&#xff1f;3. 什么是云原生&#xff1f;4. 微软Azure与亚马逊AWS的主要区别是什么&#xff1f;5. 为…...

Netty学习笔记1

Netty学习笔记&#xff08;一&#xff09; 在的互联网环境下&#xff0c;分布式系统大行其道&#xff0c;而分布式系统的根基在于网络编程&#xff0c;而 Netty 恰恰是 Java 领域网络编程的王者。如果要致力于开发高性能的服务器程序、高性能的客户端程序&#xff0c;必须掌握…...

RISK-V品牌的中国化历程(中)

目录 1.技术优势 出道即巅峰 2.生态布道 品牌根植中国 3.应用场景 加速品牌的商业化运作 生态布道 品牌根植中国 2015年成立非盈利组织RISC-V基金会&#xff0c;目前已吸引全球28个国家327家会员&#xff0c;包括英伟达、联发科、苹果、特斯拉、谷歌、高通、IBM、三星、麻省理…...

2023.02.19 学习周报

文章目录摘要文献阅读1.题目2.摘要3.介绍4.本文贡献5.方法5.1 Local Representation Learning5.2 Global Representation Learning5.3 Item Similarity Gating6.实验6.1 数据集6.2 结果7.结论深度学习1.对偶问题1.1 拉格朗日乘数法1.2 强对偶性2.SVM优化3.软间隔3.1 解决问题3.…...

枚举类的使用方法

一、理解枚举类型 枚举类型是Java 5中新增特性的一部分&#xff0c;它是一种特殊的数据类型&#xff0c;之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束&#xff0c;但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。下面先来看看如何写…...

.NET3.5安装步骤及相关问题。

.NET3.5全称 Microsoft.NETFramework3.5 最新版本-.NET4.8 第一步打开控制面板 windows系统打开控制面板 选择程序 选择.NET3.5安装。 可能会出现问题。 解决方案&#xff1a; 报错代码80240438的常用解决办法&#xff1a; 方法一&#xff1a;检测windows update servic…...

联想M7268激光打印机开机红绿灯双闪报错不打印

故障现象: 一台联想M7268激光打印机开机后电源键、复印键一起双闪,电源键闪红灯、复印键闪绿灯; 检测维修: 根据闪灯故障判断如果无卡纸异常情况下可能是激光器故障,因为以前曾经维修过一台一模一样的机器故障基本相同,先打开机器吧,把硒鼓拿出来先看看有没有卡纸,进纸…...

产品经理知识体系:7.web和app产品需求设计

web和app产品需求设计 思考 笔记 web产品设计 一、交互设计 1.以用户为中心的设计&#xff1a;功能、体验、用户&#xff1b; 将产品功能转化成用户的体验&#xff0c;功能和体验的结合。 2.交互设计模式 交互逻辑 信息结构 信息内容 界面结构 导航设计 二、视觉设计 元素的…...

强化学习概述

一、Modelfree 和 Modelbased Modelfree&#xff1a;不需要理解环境 Modelbased&#xff1a;需要理解环境&#xff0c;并且为环境建立模型 Model-free 中, 机器人只能按部就班, 一步一步等待真实世界的反馈, 再根据反馈采取下一步行动. 而 model-based, 他能通过想象来预判断接…...

NO.1嵌入式入门笔记:常用命令记录

一、前言 Linux文件目录&#xff1a; Linux Shell&#xff1a; 它负责接收用户的输入&#xff0c;根据用户的输入找到其它程序并运行。比如我们输入“ls”并回车时&#xff0c;shell 程序找到“ls”程序并运行&#xff0c;把结果打印出来。Shell有多种实现&#xff0c;我们常用…...

Shell编程

typora-copy-images-to: pictures typora-root-url: pictures 文章目录typora-copy-images-to: pictures typora-root-url: pictures本节课程目标语法和选项语法和选项3. sort工具语法和选项5.tee工具6.diff工具语法和选项7. paste工具8. tr工具语法和选项小试牛刀二、bash的特…...

网络模型OSI

网络模型OSI定义模型分布数据封装、解封过程数据链路层1.LLC逻辑链路控制子层(Logic Link Control Sub Layer)2.MAC媒介访问控制子层(Medium Acess Control Sub Layer)CSMA/CARST-CST原理OSI定义 OSI&#xff1a;Open Systems Interconnection Reference Model&#xff0c;开放…...

如何构建现代搜索应用:ReactiveSearch与GraphQL的终极集成指南

如何构建现代搜索应用&#xff1a;ReactiveSearch与GraphQL的终极集成指南 【免费下载链接】reactivesearch Search UI components for React and Vue 项目地址: https://gitcode.com/gh_mirrors/re/reactivesearch ReactiveSearch是一个强大的React和Vue搜索UI组件库&a…...

AI辅助学术写作:Qwen3-0.6B-FP8搭配LaTeX生成论文章节与参考文献

AI辅助学术写作&#xff1a;Qwen3-0.6B-FP8搭配LaTeX生成论文章节与参考文献 写论文&#xff0c;尤其是写引言和参考文献&#xff0c;是不是让你特别头疼&#xff1f;对着空白的文档发呆&#xff0c;不知道从何下笔&#xff1b;或者为了找一篇关键的参考文献&#xff0c;在数据…...

不用编译!快速修改Scratch-blocks积木字体的偷懒方法

零编译实战&#xff1a;Scratch-blocks字体调整极简方案 在Scratch 3.0的二次开发过程中&#xff0c;积木字体过小是开发者普遍遇到的痛点。官方移除了字体调节功能后&#xff0c;低分辨率设备上的中文显示尤为模糊。传统解决方案需要配置Python环境并重新编译scratch-blocks库…...

AI净界-RMBG-1.4入门指南:理解Alpha通道、PNG透明度与导出规范

AI净界-RMBG-1.4入门指南&#xff1a;理解Alpha通道、PNG透明度与导出规范 你是不是也遇到过这样的烦恼&#xff1f;拍了一张不错的照片&#xff0c;想换个背景发朋友圈&#xff0c;或者做电商需要把商品图抠出来&#xff0c;结果发现边缘抠得跟狗啃的一样&#xff0c;头发丝和…...

图像比对与像素级分析:用diffimg实现高效差异检测

图像比对与像素级分析&#xff1a;用diffimg实现高效差异检测 【免费下载链接】diffimg Differentiate images in python - get a ratio or percentage difference, and generate a diff image 项目地址: https://gitcode.com/gh_mirrors/di/diffimg 在视觉内容创作与技…...

告别‘Illegal instruction’:为老旧ARM芯片(如鲲鹏920)定制MongoDB 4.4.9的完整避坑流程

为老旧ARM芯片定制MongoDB 4.4.9的完整避坑指南 当你在国产ARM服务器上部署MongoDB时&#xff0c;是否遇到过Illegal instruction错误&#xff1f;这个问题往往源于硬件与软件版本之间的指令集不匹配。本文将带你深入理解ARM架构的版本差异&#xff0c;并提供一套完整的解决方案…...

springboot+vue基于web的大学生课程排课管理系统设计

目录 功能模块分析后台管理系统&#xff08;SpringBoot&#xff09;前端系统&#xff08;Vue&#xff09; 技术实现要点 项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作 功能模块分析 后台管理系统&#xff08;SpringBoot&…...

技术竞赛之道:从创新构想到落地执行的实战心法

技术竞赛之道&#xff1a;从创新构想到落地执行的实战心法 【免费下载链接】A-to-Z-Resources-for-Students ✅ Curated list of resources for college students 项目地址: https://gitcode.com/GitHub_Trending/at/A-to-Z-Resources-for-Students 在当今技术驱动的时…...

Ubuntu服务器上配置KVM虚拟化环境:从零搭建Windows开发环境

1. 为什么要在Ubuntu服务器上跑Windows&#xff1f; 很多开发者可能都有这样的困惑&#xff1a;明明手头有性能强劲的Ubuntu服务器&#xff0c;但某些开发工具只能在Windows环境下运行。比如Visual Studio、SQL Server Management Studio这些微软系工具&#xff0c;或者某些行业…...

Piping Server开发者指南:如何基于流传输构建自己的应用

Piping Server开发者指南&#xff1a;如何基于流传输构建自己的应用 【免费下载链接】piping-server Infinitely transfer between every device over pure HTTP with pipes or browsers 项目地址: https://gitcode.com/gh_mirrors/pi/piping-server Piping Server是一个…...