引用对象所创建的对象都是储存在堆中,堆中的数据无法像存在栈中的基本数据类型一样,用完后即销毁,如果还有外部指针指向堆中的数据,那么这个数据就不会被当成垃圾并被回收掉,但是我们同时还要注意可达性的概念,即便有外部指针指向这个数据,但是当这个数据在我们外部不可达时也会被挡成垃圾并回收。例如:
这是我们将 mother 和 family 指向 father 的指针删除后,father 就被自动当成垃圾并回收。
这是我们将 family 指向对象的指针删除后,下面的 father 和 mother 对象即使互相之间还有指针互相指向,但是对于外部环境而言这一部分数据已经不可达了,所以下面这一部分数据同样会被当作垃圾回收。
关闭浏览器时,上面的一切都将不存在,讨论的是代码执行的状态。
1.标记清除
浏览器在运行的时候会给存储在内存中的所有变量都加上标记
去掉环境中的变量以及被环境中引用的变量的标记
如果还有变量有标记,就会被视为准备删除的变量
垃圾回收机制完成内存的清除工作,销毁那些带标记的变量,并回收他们所占用的内存空间
2.引用计数
声明了一个变量并将一个引用类型的值赋值给这个变量,这个引用类型值引用次数就是1
同一个值又被赋值另一个变量,这个引用类型的值引用次数加1
当包含这个引用类型值得变量又被赋值另一个值了,那么这个引用类型的值的引用次数减一
当引用次数变成0时, 说明这个值需要解除引用
当垃圾回收机制下次运行时,它就会释放引用次数为0的值所占用的内存