这是我参与「第五届青训营」伴学笔记创作活动的第 4 天
前言
本文章记录了Go 语言内存管理详解预习的部分内容,记录了今天所预习的部分知识
1.自动内存管理
内存管理的基本概念: 对于内存管理是由程序运行时系统管理动态内存,可以避免程序员手动内存管理,只需要专注业务实现逻辑,相对于C来说不需要程序员手动释放内存可以减少程序员的犯错以及内存的使用的安全性和正确性
1.1内存管理的名词解释
double-free problem:同一个指针free两次。double free的原理和堆溢出是差不多的。在程序运行中只要一个free指向堆内存的指针都可能会有漏洞
use-after-free problem:字面翻译表达的意思,当内存被释放后再次使用。但是在使用过程中会出现几种情况:1.内存被释放后,指针设置为NULL,再次使用时,程序会奔溃。2.内存被释放后,指针没有被设置NULL,下次使用之前,代码没有修改这块内存,程序可能可以正常运转。3.内存释放后,指针没有被设置为NULL,下次使用之前,代码对内存修改,再次使用的时候就可能会出现很奇怪的BUG
1.2引用计数器
为每个对象创建一个引用计数,有对象引用时计数器 +1,引用被释放时计数 -1,当计数器为 0 时就可以被回收。它有一个缺点不能解决循环引用的问题;
1.3追踪垃圾回收
定义一些GC Roots的对象为起始点,追踪对象是否能通过一个引用链(a chain of references )达到这些确定的GC Roots对象上,那些无法达到这些跟对象(root object)的对象将被视为已死亡。这种算法实际实现会复杂多变。
引用参考
参考的部分内容来源于以下网页或者书籍:
- 【后端专场 学习资料二】第五届字节跳动青训营
- 垃圾回收算法手册