垃圾回收

  • js垃圾回收是自动进行的
  • 如果对象是可达的,它一定是存在于内存中的
  • 一组相互连接的对象可能整体都不可达
 1 function marry(man,woman){
 2     woman.husband=man;
 3     man.wifr=woman;
 4      
 5     return {
 6     father:man,
 7     mother:woman
 8     }
 9 }
10 
11 let family=marry({
12     name:"飞蓬"
13 }, {
14     name:"夕瑶"
15 });

marry:是一个函数变量,保存的是函数。

family:是一个对象变量,用于保存对象。

内存中有两个对象:给他们起个名字叫obj1和obj2。这两个对象中各有一个键值对,name:value;

给obj2添加一个属性叫做husband,并用man这个对象来给其赋值。

给obj1添加一个属性叫做wife,并用woman这个对象来给其赋值。

先停下来看看现状:

从obj1的角度:

我本身就是一个对象,里头有一个属性叫做name:"飞蓬",现在又多了一个变量wife,这个wife指向我真正的老婆obj2。

从obj2角度同理。

从family角度:

我本身是一个变量(对象变量),现在通过marry函数调用得到了该函数返回的一个对象。

这两个对象在我这里叫做father和mather。

对象就在那里,只是名字一直在变。

一个对象,只有被引用时才会成为可达状态。

对象内部互相引用,没有外部参与,不可达。

垃圾回收的算法:

  1. 找到并标记所有的根
  2. 遍历并标记所有来自根的引用
  3. 遍历已经标记的对象并标记他们的引用。
  4. 直到所有的可达引用都被访问到
  5. 未被标记的对象会被删除

优化垃圾回收的方法:

分代收集:旧的和新的对象。

增量收集:把回收工作分成几部分

闲时收集:只在cpu空闲时回收

原文地址:https://www.cnblogs.com/flyover/p/14105720.html