- 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。
对象就在那里,只是名字一直在变。
一个对象,只有被引用时才会成为可达状态。
对象内部互相引用,没有外部参与,不可达。
垃圾回收的算法:
- 找到并标记所有的根
- 遍历并标记所有来自根的引用
- 遍历已经标记的对象并标记他们的引用。
- 直到所有的可达引用都被访问到
- 未被标记的对象会被删除
优化垃圾回收的方法:
分代收集:旧的和新的对象。
增量收集:把回收工作分成几部分
闲时收集:只在cpu空闲时回收