5:MemoryLeakandroid
在Java中內存泄漏是隻,某個(某些)對象已經不在被使用應該被gc所回收,但有一個對象持有這個對象的引用而阻止這個對象被回收。好比我 們一般會這樣建立一個View TextView tv = new TextView(this);這裏的this一般都是Activity。因此這個TextView就持有着這個Activity的引用。下面看張圖 (Google IO 2011 ppt中抄得)
一般狀況下,當用戶轉動手機的時候,android會從新調用OnCreate()方法生成一個新的Activity,原來的 Activity應該被GC所回收。但若是有個對象好比一個View的做用域超過了這個Activity(好比有一個static對象或者咱們把這個 View的引用放到了Application當中),這時候原來的Activity將不能被GC所回收,Activity自己又持有不少對象的引用,因此 整個Activity的內存被泄漏了。
備註:常常致使內存泄漏核心緣由: keeping a long-lived reference to a Context.持有一個context的對象,從而gc不能回收。 狀況以下:緩存
1.一個View的做用域超出了所在的Activity的做用域,好比一個static的View或者把一個View cache到了application當中 etc
理解:內存:注意靜態的數據和緩存中的數據;注意釋放;app
2.某些與View關聯的Drawable的做用域超出了Activity的做用域。this
3.Runnable對象:好比在一個Activity中啓用了一個新線程去執行一個任務,在這期間這個Activity被系統回收了, 但Runnalbe的 任務尚未執行完畢並持有Activity的引用而泄漏,但這種泄漏通常來泄漏一段時間,只有Runnalbe的線程執行完閉,這個 Activity又能夠被正常回收了。線程
4.內存類的對象做用域超出Activity的範圍:好比定義了一個內存類來存儲數據,又把這個內存類的對象傳給了其它Activity 或者Service等。由於內部類的對象會持有當前類的引用,因此也就持有了Context的引用。解決方法是若是不須要當前的引用把內部類寫成static或者,把內部類抽取出來變成一個單獨的類,或者把避免內部對象做用域超出Activity的做用域。out Of Memery Error 在android中每個程序所分到的內存大小是有限的,若是超過了這個數就會報Out Of Memory Error。 android給程序分配的內存大小與手機硬件有關,如下是一些手機的數據:對象
G1:16M Droid:24 Nexus One:32M Xoom:48Ms
因此儘可能把程序中的一些大的數據cache到本地文件。以避免內存使用量超標。
記得數據傳遞完成以後,把存放在application的HashMap中的數據remove掉,以避免發生內存的泄漏內存