標籤:style java 使用 strong 問題 cti
OOM_ADJ
對於低記憶體的時候,我們總是想盡量殺掉background的app,盡量保留persist service(比如IME),讓前台app能夠流暢的運行。
1,background app的adj盡量設高一些,但是max和mini之前,盡量還是要保留一些差距,這樣讓系統可以逐步去kill進程,
而不是一次殺掉很多。一次殺掉很多app很容易造成系統卡頓。
2,previeous app和home launcer的adj一定要獨立出來,並且不能設定太低,previous app可能會佔用很多的記憶體。
SWAP
swap主要是閥值的設定,什麼時候去觸發swap。
swap的使用主要目標是,在為了保證前台app的正常運行,在記憶體不夠的情況作為一個補充。比如browser在小記憶體機器上
只能開啟2個page,如果開了swap,可以開啟5個page。
對於背景其他程式,不需要使用swap,因為swap畢竟會降低一些效能,而是盡量殺掉太慢來讓前台應用盡量的使用實體記憶體。
所以swap的閥值大於Persist service的adj比較合適,這樣保證必須的服務還存在,讓前台應用可以正常運行。
CMA
low memory killer在計算剩餘記憶體的時候,cma的確是個頭疼的問題。
cma不是任何時間可以隨意使用的,下一個時刻他可能就需要分配。
cma的使用,基本策略應該還是給前台app用,保證他的運行,對於後台app,不要計算cma為free。
如果當前app不需要使用到cma相關的驅動:
在後台app都被殺光的情況下,可以使用cma的記憶體。當啟動一個新的app的時候,這個app會變成previous app,
而當前記憶體又是低於previous app要求的free的,所以他會被kill,那麼cma的記憶體就被放出來了,不會出現問題。
如果當前的app會使用cma的記憶體:
比如當前activity不會使用,但是下一個acitivty可能就需要使用cma相關的驅動,這種情況下cma就無法使用了(或者只能使用部分),因為你不知道什麼時候系統會需要使用cma的記憶體。
是否有途徑可以知道當前app是否使用到cma相關的驅動,使用了多少?
在相關的java類沒有被使用前是無法知道的,所以目前來看是沒法處理的。
那麼目前只能把cma當做一個節省記憶體的途徑來使用了。