close

最近面試一直被打槍

理由都是考卷沒有過, 演算法都還給老師了, 被打槍也應該

扯遠了, 回來繼續說

在眾多的考試中, 對於資深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給清空

 

觀念參考:什么是Java的弱引用(Weak Reference)

更詳細的觀念

arrow
arrow
    文章標籤
    java weakreference
    全站熱搜

    Owen Chen 發表在 痞客邦 留言(0) 人氣()