2019獨角獸企業重金招聘Python工程師標準>>>
為什么要進行內存優化呢?其實我們可以反過來想。如果不進行內存優化會產生什么樣的問題?
App的運行是有內存限制的,超過限制會產生OOM,導致App崩潰。如果內存不進行優化,運行的內存一旦超出了這個限制,就會導致程序的崩潰。程序的崩潰對于應用程序來說是一個非常嚴重的。如果App不進行內存優化,在流暢性、響應速度和用戶體驗上都會有很差的效果。
首先,我們來看一下內存的管理方式。
1、Android系統的內存分配和回收方式。
一個App通常就是一個進程對應一個虛擬機。GC只在heap剩余空間不足時,才會進行垃圾回收。GC觸發時,所有的線程都會被暫停。
2、App內存限制機制。
每個App分配的最大內存限制,隨著不同的設備而不同。吃內存大戶是圖片。App中用到的圖片也很多。為什么要限制內存呢?我們的手機上有很多個應用。如果一個App把內存用光了,別的App就沒有辦法運行了。為了避免這種情況的出現,我們必須要限制App的內存。
3、切換應用時后臺App清理機制。
App切換時的LRU Cache的方式進行應用間的切換。清理的時候系統會調用onTrimMemory()回調方法。
4、監控內存的幾種方法。
其次,App內存的優化方法。
1、數據結構優化。
頻繁字符串拼接用StringBuilder。ArrayMap、SparseArray替換HashMap。內存抖動。再小的class也要消耗0.5kb。HashMap一個entry需要額外占用32b。
2、對象復用。
復用系統自帶的資源。ListView和GridView 的ConverView復用。避免在onDraw方法里執行對象的創建。
3、什么是內存泄漏,及其應對方法。
在邏輯上,某個內存塊已經不用了。由于代碼上的失誤導致這塊內存雖然停止不用了,但是依然被其他東西占用,使得GC無法對它進行回收。
內存泄漏會導致可用的Heap越來越少,頻繁觸發GC。尤其是Activity泄漏。用Application Context而不是Activity Context。注意Cursor對象是否及時關閉。
最后,OOM問題優化。
1、OOM問題分析。
必然性和可解決性。OOM絕大部分出現在圖片上。
2、強引用、軟引用的意義。
3、優化OOM問題的方法。
注意臨時Bitmap對象的及時回收。避免BitMap的浪費。Try catch某些大內存的分配。加載Bitmap時候縮放比例、解碼格式、局部加載。