以下內(nèi)容整理自互聯(lián)網(wǎng),僅用于個人學(xué)習(xí)
- 內(nèi)存泄漏導(dǎo)致內(nèi)存占用較高,導(dǎo)致JVM頻繁觸發(fā)GC。
解決辦法:盡可能的減少生命周期長的對象引用生命周期短的對象。
內(nèi)存泄漏的原因:
- 各種資源在使用后沒有及時釋放關(guān)閉
集合類泄漏
單例造成的泄漏
構(gòu)造Adapter時,沒有使用convertView重用
Bitmap對象不再使用時沒有調(diào)用recycle釋放內(nèi)存
靜態(tài)變量引用對象,Application引用對象
非靜態(tài)內(nèi)部類/匿名內(nèi)部類持有外部類的引用
Handler造成內(nèi)存泄漏。Handler與Message和MessageQueue都是相互關(guān)聯(lián)的,萬一Handler發(fā)送的Message尚未被處理,則該Message以及發(fā)送它的Handler對象被線程MessageQueue一直持有。(Handler為非靜態(tài)內(nèi)部類)
解決辦法:避免使用非靜態(tài)內(nèi)部類,將Handler聲明為靜態(tài)的,同時通過弱引用的方式引入Activity,在Activity的onDestroy或者onStop種一處消息隊列種的消息。加載大數(shù)據(jù),占用太多內(nèi)存,同樣導(dǎo)致JVM頻繁GC。
解決辦法:要是Bitmap占用太多內(nèi)存。可以通過根據(jù)需要顯示的Bitmap寬高設(shè)定采樣率來壓縮圖片。另外,通過采用LRUCache方法避免。如果是其他的大數(shù)據(jù)比如3D模型數(shù)據(jù),可以通過使用Native空間,使用ByteBuffer.allocate(size);UI線程做耗時任務(wù)(數(shù)據(jù)庫操作,數(shù)據(jù)計算等),1秒繪制60幀才不會卡頓,即16.6ms要刷新一次才不會卡頓。
解決方法:另外創(chuàng)建線程做耗時任務(wù)。UI OverDraw。
在包含ImageView的ListView中,等滑動停止后加載圖片。