目录
一、什么是强引用
二、弱引用
三、强引用和弱引用相比
强引用是指向内存申请一段存储空间,进行存储的引用类型的对象的引用,在对象获得的分配内存空间中不仅仅存放了对象的信息,还存放着该对象被引用的次数。
我们常见的普通对象的引用 例如Object obj = new Object();
var obj = new Object(); obj = 10;
弱引用一旦被垃圾回收器检测到,就会被回收。
新的weakSet和WeakMap中,表示存储的对象值/键名所引用的对象都是被弱引用的
以WeakMap为例
let obj = { name: 'toto' } let weakmapObj = new WeakMap() weakmapObj.set(obj, 'any value') obj = null weakmapObj .size() // 0
对象被垃圾回收器删除,因为weakmap在对象{ name: ‘toto’ }上只有弱引用,而这个对象已经没有强引用了。(只有变量obj有保持引用)
二者相比,有一个广为流传非常形象的比喻:
强引用就是一个小孩A牵着一条狗,他们之间通过狗链儿连着
弱引用就是,旁边有个小孩B指着A牵的狗,说:嘿,那有条狗,B指向那条狗,但他们之间没有是指绑在一起的东西
当A放开狗链,狗就会跑掉(被垃圾回收),无论B是不是还指着
但是,当B不再指着那条狗,狗还被A牵着,不会影响它是否跑掉
简单来说:强引用的不会被垃圾回收机制回收了,但是 弱引用可是会回收的 ;弱引用 并不会屏蔽 垃圾回收机制