Android優化技巧—內存優化

一、查詢應用運行的內存限制

代碼如下:

ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
/**
  * 手機上app運行時的內存限制
  */
int memClass = activityManager.getMemoryClass(); // 以m爲單位
/**
 * AndroidManifest.xml中application中有個largeHeap屬性可配置去獲取更
 * 大內存,但一般不會設置,而且大多數手機中也不起作用           
 */
int LargememClass = activityManager.getLargeMemoryClass(); // 以m爲單位

二、Android系統內存分配與回收方式

1.一個APP通常就是一個進程對應一個虛擬機(可能存在多進程的情況)
運行app後,通過adb命令可以進入模擬器的linux環境進行查看內存分配
adb shell // 進入安卓底層linux系統命令
ps // 查看系統裏面進程的命令

通過app包名找到所在進程,可以查看一些基礎的內存信息,並可進一步詳細查詢
dumpsys meminfo 包名

2.GC只在Heap剩餘空間不夠時纔會發出垃圾回收
3.GC觸發時,所有的線程都是會被暫停

三、APP內存限制機制

1.每個APP分配的最大內存限制,隨不同設備而不同
2.吃內存大戶:圖片
3.通過內存限制,防止不同app的互相影響

四、切換應用時後臺APP清理機制

1.App切換時採用Lru Cache
2.onTrimMemory()回調方法:在系統內存發生變化時會發送給各個應用,在這裏面可以進行一些不重要內存的回收,可以減少被清理的可能

五、監控內存的幾種方法演示

1.Android studio代碼

Float totalMemory = Runtime.getRuntime().totalMemory() * 1.0f / (1024 * 1024) // 運行中的總共內存
Float freeMemory = Runtime.getRuntime().freeMemory() * 1.0f / (1024 * 1024) // 運行時的空閒內存
Float maxMemory = Runtime.getRuntime().maxMemory() * 1.0f / (1024 * 1024) // 運行時的最大內存

2.AS下方的Android Monitor中的Monitors:可以實時顯示內存的變化
3.AS中的Android Device Monitor:可以顯示設備的具體線程,選擇線程後點擊Cause GC

六、APP內存優化方法

1.數據結構優化
1.1 頻繁字符串拼接用StringBuilder
1.2 ArrayMap、SpareArray替換HashMap
1.3 內存抖動(申請了很多內存,很快就不用了,如此反覆)
1.4 再小的Class至少也要耗費0.5KB
1.5 HashMap一個entry需要額外佔用32B

2.對象複用
2.1 複用系統自帶的資源
2.2 ListView/GridView中的contentView複用
2.3 避免在onDraw方法裏面執行對象的創建

3.避免內存泄露
內存泄露:由於代碼瑕疵,導致這塊內存,雖然是停止不用了,但依然被其他東西引用着,使得GC沒法對它回收
3.1 內存泄露會導致剩餘可用Heap越來越少,頻繁觸發GC
3.2 尤其是Activity泄漏
3.3 儘量用Application Context而不是Activity Context

七、OOM問題優化
1.注意臨時Bitmap對象的及時回收,避免Bitmap的浪費
2.Try Catch某些大內存分配的操作
3.加載Bitmap:縮放比例、解碼格式、局部加載、軟引用、緩存

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章