最近面試一直被打槍
理由都是考卷沒有過, 演算法都還給老師了, 被打槍也應該
扯遠了, 回來繼續說
在眾多的考試中, 對於資深android / Java Engineer 職務
都會考一個觀念,那就是GC機制
而最主要的就是WeakReference觀念
什麼是GC
GC(Garbage Collection,垃圾收集,垃圾回收)机制, 是Java中獨有的記憶體回收機制,但對於JAVA / Android開發者來說,記憶體洩漏/溢位都交由JVM中的自動内存管理和垃圾回收機制(GC)處理.
概括來說回收記憶體的條件為
1. 當該物件沒有被任何人使用的時候
2. GC機制啟動的時候
該物件就被會被回收
那對開發者來說,就隨便使用物件就好了嗎,反正GC會回收?
但還是有條件的,若該物件沒有被任何人使用,又或者說該物件沒有被其他物件做參考
這部分在程式開發中是很常用到的,但在記憶體管理/效能優化方便卻是有問題
這時候就要使用Java 提出的 WeakReference這個類別了
若對GC還有興趣的朋友可連至繼續研究 http://www.cnblogs.com/zhguang/p/3257367.html
以下是個範例
先建立一個Dog的Class
public class Dog { private double mPrice; private String mColor; public Dog(double price, String color){ this.mPrice = price; this.mColor = color; } public double getPrice() { return mPrice; } public void setPrice(double price) { this.mPrice = price; } public String getColor() { return mColor; } public void setColor(String color) { this.mColor = color; } public String toString(){ return mColor +"dog costs: $"+mPrice; } }
在主程式中使用該物件
Dog car = new Dog(22000, "white");
並把它塞入Reference中
WeakReference mWeakDog = new WeakReference(car);
WeakReference的參數為泛型,只需要指定該類型與相應物件並可以使用.
使用時須先用mWeakDog.get()抓出Dog物件,並在做相應使用
以下是我的範例code
private static WeakReference mWeakDog; static void testWeekReference(){ Dog car = new Dog(22000, "white"); mWeakDog = new WeakReference(car); int i=0; while(true){ if(mWeakDog.get()!=null){ i++; if(i < 66000){ mWeakDog.get().setPrice(i); System.out.println("mWearCar.get().getPrice:" + mWeakDog.get().getPrice()); } System.out.println("Object is alive for "+i+" loops - " + mWeakDog); }else{ System.out.println("Object has been collected."); break; } } }
當系統偵測沒有人用到Dog類別後,會自動把mWeakDog給清空
留言列表