android 的OOM

問題過了好久了,網上查了一些資料自己動手試了試,情況應該如下:
首先要明白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的機制和修改
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章