golang入门笔记——内存管理

news2024/9/23 19:26:35

文章目录

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

自动内存管理

概念

1.动态内存

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

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

避免手动内存管理,专注于实现业务逻辑

保证内存使用的正确性和安全性:double-free problem,use-after-free problem

3.三个任务

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

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

	 Mutator:业务线程,分配新对象,修改对象指向关系
	 Collector:GC线程,找到存活对象,回收死亡对象的内存空间
	 Serial GC:只有一个collector
	 Parallel 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 collection
	GC吞吐率很高

老年代(Old generation)

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

引用计数

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

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

缺点:

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

在这里插入图片描述

内存分配

Go内存分配-分块

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

	提前将内存分块
		1.调用系统调用mmap()向OS申请一大块内存,例如4MB
		2.先将内存划分成大块,例如8KB,称作mspan
		3.再将大块继续划分成特定大小的小块,用于对象分配
		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 pointer
	pprof:对象分配的函数是最频繁调用的函数之一

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的算法管理小对象

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/356935.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据全系安装

内容版本号CentOS7.6.1810ZooKeeper3.4.6Hadoop2.9.1HBase1.2.0MySQL5.6.51HIVE2.3.7Sqoop1.4.6flume1.9.0kafka2.8.1scala2.12davinci3.0.1spark2.4.8flink1.13.5 1. 下载CentOS 7镜像 CentOS官网 2. 安装CentOS 7系统——采用虚拟机方式 2.1 新建虚拟机 2.2.1 [依次选择]-&…

SPI通讯简介

一、基本概念 SPI是串行外设接口(Serial Peripheral Interface)的缩写&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;主要应用在EEPROM,FLASH,实时时钟&#xff0c;AD转换器&#xff0c;多MCU间通讯等等&#xff0c;SPI端口可以在多主器件…

从业6年,对敏捷和自动化测试的一点心得

不久前&#xff0c;参加Thoughtworks组织的一场自动化测试的分享&#xff0c;同事由于出差国外不能参加&#xff0c;特意嘱托我提问两个问题&#xff1a; 在互联网这个将“敏捷”与“持续集成”进行积极实践的环境里&#xff0c;“敏捷测试”与“自动化测试”成了一个大家经常…

【数据库数据乱码错误】存进去的数据乱码(???)

目录 1.当我新增一条数据的时候&#xff0c;成功后查看数据库中的数据时&#xff0c;竟然变成&#xff1f;&#xff1f;&#xff1f;乱码格式了&#xff1a; 2.那么问题有3处需要注意&#xff1a; 第一&#xff1a;settings配置 第二&#xff1a;POM文件 第三&#xff1a;…

JavaWeb8-线程安全问题

目录 1.概念 1.1.单线程 1.2.多线程 2.导致线程不安全的5个因素 ①抢占式执行&#xff08;首要原因&#xff09; ②多个线程同时修改了同一个变量 ③非原子性操作 ④内存可见性 ⑤指令重排序 线程优点&#xff1a;加速程序性能。线程缺点&#xff1a;存在安全问题。 1…

深入理解设备像素比

文章目录参考描述像素分辨率显示分辨率图像分辨率物理分辨率分辨率单位&#xff08;仅部分&#xff09;DPIPPI设备像素比设备物理像素设备独立像素设备像素比产生放大与缩小尾声参考 项目描述关于物理像素、逻辑像素&#xff08;css像素&#xff09;、分辨率、像素比的超详细讲…

信源分类及数学模型

本专栏包含信息论与编码的核心知识&#xff0c;按知识点组织&#xff0c;可作为教学或学习的参考。markdown版本已归档至【Github仓库&#xff1a;information-theory】&#xff0c;需要的朋友们自取。或者公众号【AIShareLab】回复 信息论 也可获取。 文章目录信源分类按照信源…

Tomcat 线上调优记录

原始Tomcat配置 启动参数Plaintext-Xms256m -Xmx512m -XX:MaxPermSize128m Tomcat 参数配置XML<Executor name"tomcatThreadPool" namePrefix"catalina-exec-" maxThreads"1500" minSpareThreads"50" maxIdleTime"600000&q…

传感器原理及应用期末复习汇总(附某高校期末真题试卷)

文章目录一、选择题二、填空题三、简答题四、计算题一、选择题 1.下列哪一项是金属式应变计的主要缺点&#xff08;A&#xff09; A、非线性明显 B、灵敏度低 C、准确度低 D、响应时间慢 2.属于传感器动态特性指标的是&#xff08;D&#xff09; A、重复性 B、线性度 C、灵敏…

Centos7安装Python3

前言系统版本&#xff1a;Centos7.6python版本&#xff1a; python 3.10.4下载python下载链接&#xff1a;直通车找到对应版本的python安装包,这里以python 3.10.4为例点击3.10.4版本的链接&#xff0c;拉到最下面找到Files中对应的linux安装包鼠标右键复制下载链接登录linux系…

西电_数字信号处理二_学习笔记

文章目录【 第1章 离散随机信号 】【 第2章 维纳滤波 】【 第3章 卡尔曼滤波 】【 第4章 自适应滤波 】【 第5章 功率谱估计 】这是博主2022秋季所学数字信号处理二的思维导图&#xff08;软件是幕布&#xff09;&#xff0c;供大家参考&#xff0c;如内容上有不妥之处&#xf…

面试题记录

Set与Map的区别 map是键值对&#xff0c;set是值的集合。键&#xff0c;值可以是任何类型map可以通过get获取&#xff0c;map不能。都能通过迭代器进行for…of遍历set的值是唯一的&#xff0c;可以做数组去重&#xff0c;map&#xff0c;没有格式限制&#xff0c;可以存储数据…

Lesson4---Python语言基础(2)

4.1 内置数据结构 4.1.1 序列数据结构&#xff08;sequence&#xff09; 成员是有序排列的每个元素的位置称为下标或索引通过索引访问序列中的成员Python中的序列数据类型有字符串、列表、元组 “abc” ≠ “bac” 4.1.1.1 创建列表和元组 Python中的列表和元组&#xff0c…

阶段二10_面向对象高级_分类分包思想和案例环境搭建

一.分类思想 1.分类思想概念&#xff1a; 分工协作&#xff0c;专人干专事 2.信息管理系统分类[案例] Student 类-------------------->标准学生类&#xff0c;封装键盘录入的学生信息&#xff08;id , name , age , birthday&#xff09; StudentDao 类-----------------&…

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

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

vTESTstudio - VT System CAPL Functions - VT7001

vtsSerialClose - 关闭VT系统通道的串行端口功能&#xff1a;关闭由系统变量命名空间指定的VT系统通道的串行端口。Target&#xff1a;目标通道变量空间名称&#xff0c;例如&#xff1a;VTS::ECUPowerSupply返回值&#xff1a;0&#xff1a;成功重置目标通道最大和最小值-1&am…

密码的世界

网络世界中常见的攻击方法 窃听攻击 窃听攻击是网络世界最常见的一种攻击方式&#xff0c;一些不能泄露的隐私信息&#xff0c;例如银行卡密码&#xff0c;账号密码&#xff0c;如果被窃听泄露的话通常会带来比较严重的后果。 中间人攻击 在中间人攻击中&#xff0c;小明准…

九龙证券|突然哑火!最火爆中小盘明显回调,后市咋走?机构最新解读

中证1000和国证2000指数创年内新高后&#xff0c;连续2日回调。 2月17日A股商场震动下行&#xff0c;创业板指数跌幅超2%&#xff0c;近3000只个股跌落&#xff0c;北向资金小幅净流入&#xff0c;商场成交额接近万亿关口&#xff0c;港股也出现显着回调痕迹。 以中小市值公司…

XSS基础——xsslabs通关挑战

目录XSS基础一、XSS基础概念1、XSS基础概念2、XSS分类二、xsslabs通关挑战level 1level 2level 3htmlspecialchars函数html事件属性level 4level 5level 6level 7level 8深入理解浏览器解析机制和XSS向量编码level 9level 10level 11level 12level 13三、总结XSS基础 一、XSS基…

算法刷刷刷| 二叉树篇| 110平衡二叉树| 257二叉树的所有路径 |404左叶子之和| 513找树左下角的值| 112路径总和| 113路径总和II

110.平衡二叉树 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 class Solution {public boolean isBalanced(TreeNode root) {int dfs…