垃圾回收
js中的内存管理是自动执行的,而且是不可见的。我们创建基本类型,对象,函数等这些都需要内存。
js内存管理-可达性
js中内存管理的主要概念是可达性。“可达性”值就是那些以某种方式可访问或可用的值,它们被保证存储在内存中。
1.一组基本的固有可达值,这些可达值不可删除
-
本地函数的局部变量和参数
-
当前嵌套调用链上的其他函数的变量和参数
-
全局变量
-
还有一些其他的,内部的。
这些值称之为根
2.如果引用或引用链可以从根访问任何其他值,则认为该值是可访问的。
如果局部变量中有对象,并且该对象具有引用另一个对象的属性,则该对象被视为可达性,它引用的那些也是可以访问的。一个对象的引用
箭头标识一个对象的引用,全局变量oneStudent引用对象{name:’'tom},可以同个oneStudent.name访问到该对象中tom的数据,此为可达性。
对全局变量oneStudent进行覆盖
此时oneStudent指向的是null,对象{name:‘tom’}不能通过任何方式到达该对象,没有对该对象的引用,垃圾回收器将丢弃该对象的内容并且释放内存。
两个引用
可以通过引用otherStudent.name或者引用oneStudent.name获得tom的数据,此时将对象{name:‘tom’}的地址赋值给了otherStudent
对oneStudent进行覆盖
此时虽然我们不能通过oneStudent或者tom的数据,但是我们可以引用otherStudent得到tom的数据,所以对象{name:‘tom’}也在内存中,如果我们对otherStudent内容进行覆盖,那么对象{name:‘tom’}的内存将被释放
总之
如果不能通过任何方式引用该对象,得到该对象的数据,那么该对象的内存将被释放。
垃圾回收方法之“标记-清除”
垃圾回收的步骤如下
* 垃圾回收器获取根并“标记”所有来自它们的引用。
* 然后根据它们访问所有来自它们的引用
* 然后它访问标记的对象并且标记它们的引用。多有被访问的对象都被记住,以便以后不在访问同一个对象两次。
* 以此类推,直到有未访问的引用(可以从根访问)为止
* 除标记的对象外,所有未被标记的对象都会被清除
首先
第一步
第二步