垃圾数据 :
有些数据被使用之后,可能就不再需要了,我们把这种数据称为垃圾数据
为什么要做垃圾回收:
数据一直保存在内存中,那么内存会越用越多,所以我们需要对这些垃圾数据进行回收,以释放有限的内存空间。
垃圾回收机制的原理:
一、不同语言的垃圾回收策略
通常情况下,垃圾数据回收分为手动回收和自动回收两种策略。
eg:C/C++ 就是使用手动回收策略,何时分配内存、何时销毁内存都是由代码控制的
JavaScript、Java、Python 等语言产生的垃圾数据是由垃圾回收器来释放的,并不需要手动通过代码来释放
因为数据是存储在栈和堆两种内存空间中(原始数据类型是存储在栈空间中的,引用类型的数据是存储在堆空间中的)的,所以接下来我们就来分别介绍“栈中的垃圾数据”和“堆中的垃圾数据”是如何回收的。
二、栈中的数据是如何回收的
当执行到第 6 行代码时,其调用栈和堆空间状态图如下所示:
原始类型的数据被分配到栈中,引用类型的数据会被分配到堆中。当 foo 函数执行结束之后,foo 函数的执行上下文会从堆中被销毁掉,那么它是怎么被销毁的呢?下面我们就来分析一下。
如果执行到 showName 函数时,那么 JavaScript 引擎会创建 showName 函数的执行上下文,并将 showName 函数的执行上下文压入到调用栈中,最终执行到 showName 函数时,其调用栈就如上图所示。与此同时,还有一个记录当前执行状态的指针(称为 ESP),指向调用栈中 showName 函数的执行上下文,表示当前正在执行 showName 函数。
接着,当 sho