持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情
铃铛说点题外话
上一篇我们根据案例说了内存管理,说了JS垃圾回收的两种方式:标记清除和引用计数,这一篇就详细的说说JS的垃圾回收机制。
铃铛说正文
我们先来说说为什么需要垃圾回收? 因为内存的大小是有限的,所以当我们不再需要这个变量的时候,我们需要对其进行释放,以便腾出更多的内存空间给新增变量使用。
垃圾回收分为:手动和自动
-
在手动理内存的语言中,我们需要通过一些方式自己来释放不再需要的内存,比如
free函数:- 但是这种管理的方式其实非常的低效,影响我们编写逻辑的代码的效率。
- 并且这种方式对开发者的要求也很高,并且一不小心就会产生内存泄露。
-
所以大部分现代的编程语言都是有自己的垃圾回收机制:
- 垃圾回收的英文是
Garbage Collection,简称GC; - 对于那些不再使用的对象,我们都称之为是垃圾,它需要被回收,以释放更多的内存空间;
- 而我们的语言运行环境,比如
Java的运行环境JVM(Java虚拟机) ,JavaScrip的运行环境js引擎都有内存垃圾回收器。 - 垃圾回收器我们也会简称为
GC,所以在很多地方你看到GC其实指的是垃圾回收器。
- 垃圾回收的英文是
-
GC怎么知道哪些对象是不再使用的呢?- 这里就用到了
GC算法
- 这里就用到了
-
GC垃圾回收机制有两种常用的策略- 常用的标记清除
- 不常用的引用计数
那么我们就详细的说说这两种方式是怎么实现的?
最常用的JS垃圾回收机制就是标记清除
标记变量的方法有很多种,其实核心就是给变量标记上我们可以识别的标记。
- 比如在函数内部声明一个变量时,这个变量会被加上存在于上下文的标记。当变量离开上下文的时候,也会被加上离开的标记。
- 再比如,当变量进入上下文的时候反转某一位,或者可以维护“在上下文中”和“不在上下文”中两个变量列表,可以把变量从一个列表转移到另一个列表。标记过程的实现并不重要,重要的是策略。
另一个不常用的垃圾回收策略是引用计数:引用计数的思路就是对每个值都记录它被引用的次数。
声明变量并给它赋一个引用值时,这个值的引用数为 1 。如果同一个值又被赋给另一个变量,那么引用数 +1 。如果保存对该值引用的变量被其他值覆盖了,那么引用数 -1。
当一个值的引用数为 0 时,就说明没有办法在访问到这个值了,就可以安全的回收内存了。垃圾回收程序下次运行的时候就会释放引用数为 0 的值的内存。
跟铃铛说再见
关于垃圾回收今天就说到这里了,我们只需要知道大概的就可以了。下一篇再见!!!