一、概念
引用計數法:每個物件上都有有一個計數器,當此物件被引用時加1,取消引用時減一,當計數器等於0,此物件可被回收。
二、缺點
會出現迴圈引用,導致記憶體洩漏。
三、舉例
class ZhangSan { private LiSi l; public void setLiSi(LiSi l) { this.l = l; }}class LiSi { private ZhangSan z; public void setZhangSan(ZhangSan z) { this.z = z; }}public static void main(String[] str) { LiSi l = new LiSi(); ZhangSan z = new ZhangSan(); z.setLiSi(l); l.setZhangSan(z);}
記憶體分析:
區域性變數l指向堆記憶體的物件LiSi
區域性變數z指向堆記憶體的物件ZhangSan
把LiSi物件的堆記憶體中的地址賦值給堆記憶體中的物件ZhangSan的l屬性
把ZhangSan物件的堆記憶體中的地址賦值給堆記憶體中物件LiSi的z屬性
如圖:
記憶體分析圖
當main方法執行完後,物件LiSi、ZhangSan和l、z的引用關係消失,但由於兩個物件存在迴圈引用,所以計數器不等於0,垃圾收集器無法回收。
最新評論