標籤:並且 沒有 強引用 發郵件 異常 最好 疊加 htm 釋放
在android項目開發的時候,記憶體問題一直都是很困擾我們的常見的問題,在實際開發中,如何在開發時就很好的約束&控制記憶體已經成為了一件恨重要的事情了。
1.為什麼要在開發時就要約束記憶體
因為小編從事過不同類型的APP的開發,混合式語言開發是我們現在開發中使用最常見的一種,在不同的指令碼語言的時候,我們的記憶體產生也會不一樣。
列子:下面小編就拿1)非常原生的App2)hybrid web App3)lua指令碼語言APP
備忘:因為本人電腦問題,不能夠添加圖片,具體證明類圖片會在後期閑置的時間添加
結果:在這三種情況下的布局產生的記憶體不一樣,也有很多ce回說是因為他們的一些架構原理不一樣導致的,確實,lua指令碼是使用的反射,hybrid更多的是使用addjavaScript function,拿最簡單的第一種情況和第二種情況來看,我們就會發現,我們在建立一個線性布局的時候,3)產生的記憶體會比1)多,並且寫入回收方法一樣,會發現,當我們調用ondestory()回收function的時候,1)會很快速的回收掉,而3)卻不一定,顧我們得出了如下結論,在使用不同的架構構造的時候,會對我們的記憶體產生也有很大的影響,顧我們在初期的時候一定要注意使用的架構架構,使用的什麼混合性語言開發方式,如果不在開發的時候去約束記憶體,當我們開發測試階段在約束控制記憶體就會發現異常的棘手
2.資源檔
從java轉行做android的時候,就發現android的圖片格式對應圖片演算法真的超級嚇人,隨便一張小小的圖片,看著也就2,3kb,計算下來就很大,顧資源圖片的大小,以及讀取方式(這裡指ps中圖片儲存讀取位元以及圖片清晰度等)會在很大程度的影響記憶體,尤其是在差在很多大公司提倡外掛程式化,熱更新之後,會在架構實現中以及,圖片載入中,圖片會被提前編譯然後裝載APK,會讓圖片的含KB量變得異常的嚇人,如何控制呢,
1>觀察,首先觀察圖片,看是否可以做成.9圖,如果可以做成點九圖,一定要做成點9圖偶
2>圖片壓縮,不少ce會覺得圖片的kb數量對記憶體影響不大,圖片的大小才是影響記憶體的最大頭
其實不然,在實際開發中,我們常常會發現,很多公司設計師在切圖的時候,並不會對圖片進行壓縮,當我們拿著100kb的圖片直接填充view的時候,更具計算我們會發現記憶體超級嚇人,顧發生OOM也是很常見的事情了對不對。我們這個時候就要開發自己進行一個壓縮圖片,之前有同行問我.9圖是否也可以壓縮,經過本人的實驗,.9圖是可以進行適量的壓縮,但是不能夠壓縮的太狠,否則會導致讀取異常,一般讀取異常的表現,就是把.9圖當作普通圖案讀取,所以需要特別注意哈。
3>資源圖片使用,我們一定要注意圖片的複用,如果框類型相同,最好直接寫xml shape 而不是用多張圖片
3.單列【程式碼】
在我們實際開發的時候,還是會寫很多的單列方法的,比如說我們常常使用的公用的判null方法,以及mask手機號,mask身份證等這樣的方法類,單例 是一個全域的靜態對象,當持有某個複製的類A是,A無法被釋放,記憶體就會溢出,顧一定需要注意偶。
4.內部類【程式碼】【參考了http://www.cnblogs.com/deman/p/5860976.html】
java中的內部類(匿名內部類),會持有宿主類的強引用this。
所以如果是new Thread這種,後台線程的操作,當線程沒有執行結束時,activity不會被回收。
Context的引用,當TextView 等等都會持有內容相關的引用。如果有static drawable,就會導致該記憶體無法釋放。
5.java data 產生記憶體
之前在富民銀行工作的時間,當時的PM上司,來自北京,就給妹子說,java data產生的記憶體可以不考慮,很少很少,但是經過本人的具體研究並不是如此,看了一些書,不僅發現了Shareperence儲存值有限制,activity與activity之間傳值也是有限制的,有興趣的盆友,可以百度看看,有很多類似的文章,還是非常感謝那些技術盆友的分享,平時的我很少關注這些,也是才看到,發現真的如此,顧java data產生的記憶體也是很大的一塊,不少的盆友喜歡用 okhttp相關架構,資料的解析方式真的在很大的一塊會影響記憶體,for example
1》. 靜態集合類引起記憶體泄露
主要是hashmap,Vector等,如果是靜態集合 這些集合沒有及時setnull的話,就會一直持有這些對象。
我們在使用adb 提供的記憶體查看研究工具的時候也可以很明顯看到有一行叫做java data ,顧在實際看法的時候一定要對json/xml等相關解析架構有一定的瞭解
6.項目編譯apk中疊加了無用資源等引發的記憶體溢出
之前本人在開發成都銀行手機app的時候,常常遇到在小手機上開啟apk導致記憶體一出,我們使用開發工具es,as的時候,尤其是AS產生apk的時候會疊加很多無用class以及資源,這些都會因為功能等很大程度引發記憶體溢出,比如在我們開啟手機銀行app的時候我們需要熱更新下載某些圖片資源就會引發,這些在常見的有換膚請求APP中體現最明顯,顧也很重要
上面就是小編的一些看法,沒有圖片較顯枯燥,如果與小編有不同看法,可以發郵件至[email protected],一起交流技術,一起成長。
大家一起比較關心的圖片動畫等引起的記憶體問題將會在其他的文章中與大家一起探討
android記憶體泄露相關研究【整體看】