什么是js垃圾回收机制?
JavaScript中具有自动垃圾回收机制(GC:Garbage Collection);
因为内存内容是极其有限的,js的垃圾回收机制是为了防止内存泄漏(已经不需要的某一块内存还一直存在着),垃圾回收机制就是不停歇的寻找这些不再使用的变量,并且释放掉它所指向的内存。
内存的生命周期
JS环境中分配的内存, 一般有如下生命周期:
-
内存分配:当我们声明变量、函数、对象的时候,系统会自动为他们分配内存
-
内存使用:即读写内存,也就是使用变量、函数等
-
内存回收:使用完毕,由垃圾回收自动回收不再使用的内存
全局变量一般不会回收, 一般局部变量的的值, 不用了, 会被自动回收掉
内存分配;
当不再需要某样东西时会发生什么? JavaScript 引擎是如何发现并清理它?
可达性
JavaScript 中内存管理的主要概念是可达性。
简单地说,“可达性” 值就是那些以某种方式可访问或可用的值,它们被保证存储在内存中。
案例如下:
var a = 1
声明一个变量a,然后把它赋值为1;
var a = 100
如果变量a被重新赋值为100,则数据1丢失;
现在数据1变成不可达的状态,没有办法访问它,没有对它的引用。垃圾回收器将丢弃数据1并释放内存。
具体解释如下:
第一句先在内存当中写入数据1 ,var a就是用CPU自己专门用来记录变量数据的这个内存空间;=就是将数据1 的的空间地址赋值给变量a绑定到一起;第二句就是将100赋值给变量a,把a绑定到1 的空间改成100这个空间;如果现在访问a,a一定等于100这个值。
现在这个数据1 是占着内存空间的,但是,这个数据1 以后都不会用到了,因为后续没有变量指向这个空间了;在有些语言中,需要我们手写代码来释放这些被占用的内存空间的;释放并不是将这个内存的空间的数据给清空,而是标记下这个空间CPU是可以使用的,可以写入新的数据进行覆盖的;当CPU执行后续代码的时候可能就会把内存的空内存空间重新写入新产生的数据。但是,如果某个内存空间,比如数据100的内存空间是和变量a绑定的,表明这个内存空间是在使用当中的,这个空间内存就不会被标记,CPU就不会把新产生的写入当前空间。在js中,我们不需要手动去做这些事情,有垃圾回收机制,它会自动检查有哪些内存空间是已经没有变量绑定的,如果存在就会标记它们,它会有个自动的周期性的释放或标记的过程,然后专门去释放这些标记好的内存空间的地址,告诉CPU这个空间已经被释放,可以写入新的数据放入。