有沒有對於android系統有深度了解的朋友能解答幾個問題:
1、android內存回收機制的LOW_MEMORY和OUT_OF_MEMORY的觸發是什麼條件,按照網上一些存在的資料給出的答案,LOW_MEMORY是每隔一段時間自動執行的,而OUT_OF_MEMORY是在系統內存不足的時候進行的,這種說法對嗎?如果正確,那麼他們回收內存的策略是不是一樣的?
2、android任務管理器中,內存的回收是在什麼條件下執行的,詳細的情況是,測試手機內存512,用戶可用內存大概230,目測在50M,20M時都會觸發內存回收,也就是50M和20M都是系統的穩定內存,但是有些情況下內存會小於3M仍然沒有觸發回收,這種回收的觸發需要特別條件麼?觸發回收的代碼存在於什麼地方?
問題過了好久了,網上查了一些資料自己動手試了試,情況應該如下:
首先要明白android基於linux系統,系統的內存使用規則是不一樣的。
windows下的內存管理規則為:退出即銷毀,程序的內存會被回收。
linux的內存認為不用白不用,在程序退出後,如果沒有新的內存申請,則內存不會被釋放,這樣下一次運行的時候會提高響應速度。
如此,android設計了low_memory和OUT_OF_MEMORY機制。
low_memory是在程序申請內存的時候報警,然後可以對這個報警進行一些響應,比如釋放不用的資源來防止崩潰之類的。在低內存機器中,觀察launcher在機器剛開機和運行一段時間後所占內存的大小就能發現,開機的時候內存占用很大,但是隨著應用越開越多,占用內存在一步步被釋放。
而OOM機制是機器底層的一種強制保鮮,在OOM發生的時候內核會排序強制殺掉進程來保證系統的繼續運行,同樣這種OOM異常容易發生在低內存機器上,比如512M。
首先系統會根據程序是否是空進程(已經由用戶關閉的不帶有任何服務和provider的進程),是否有服務,是否有provider,是否為前台進程,來排序,可以輸入 adb shell dumpsys meminfo來查看,列出信息中的Total PSS by OOM adjustment:就是系統為程序的OOM排序結果,OOM異常的時候會根據這個表單從下網上殺掉進程釋放內存。
OOM的阈值:是機器判定發生OOM的規則,在/kernel/drivers/staging/android/lowmemorykiller.c中可以看到
lowmem_adj[6] 為OOM等級,lowmem_minfree[6]為對應的在系統內存低於多少的時候,adj中高於該等級的活動都要被強制釋放。對應的可以修改阈值,完成後編譯lk就可以了。
以上就是關於low_memory和OOM的機制和修改