1签夭、內存溢出和內存泄漏的區(qū)別斥废,常見內存泄漏
內存溢出:一個程序被分配的內存空間是一定的,當申請的內存容量不足時就會OOM
內存泄漏:使用過的對象被其他活動的或者使用的對象所持有,不能被gc回收抡句,導致內存泄漏,內存泄漏累計起來會造成內存溢出
將非靜態(tài)對象傳給了靜態(tài)對象持有杠愧,例如待榔,將當前activity的context傳遞給單例模式的構造函數(shù),一方面在使用時應該使用applicationContext流济,另一方面可以在設計單例模式時锐锣,將context轉化為applictioncontext,或者不讓使用者傳入context
非靜態(tài)的內部類引發(fā)的內存泄漏绳瘟,非靜態(tài)內部類會隱式持有外部對象雕憔,造成內存泄漏,可以將內部類設置為靜態(tài)的糖声,使用外部類時斤彼,可以使用弱引用
使用MVP架構時分瘦,由于presenter持有View對象,當view關閉時Presenter還在執(zhí)行耗時操作違背銷毀琉苇,造成View無法回收嘲玫,可以使用若引用。
注冊和反注冊未成對使用并扇,資源對象未及時關閉去团,如cursor,File,Bitmap等,集合對象未及時清理等穷蛹。
2土陪、handler造成的內存泄漏及解決辦法
原因:使用handler一般用來解決子線程和主線程通訊問題,或者刷新UI俩莽,一般都會使用內部類甚至匿名內部類旺坠,內部類會隱性地持有外部類對象,例如activity關閉了扮超,但子線程未跑完或者使用handler延時發(fā)送消息時取刃,由于內部handler持有了activity對象抢埋,就會造成內存泄漏婶希。
解決辦法:關閉activity停止子線程鹅髓,remove掉handler當中的消息速蕊,同時使用靜態(tài)內部類导坟,他不會持有外部類的對象囚巴,若要使用外部類的變量费薄,可以以弱應用的形式持有外部類對象那先。