一、查詢應用運行的內存限制
代碼如下:
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:縮放比例、解碼格式、局部加載、軟引用、緩存