泄漏原因:
- 單例造成的內存泄漏
public class AppManager {
private static AppManager instance;
private Context context;
private AppManager(Context context) {
this.context = context;
}
public static AppManager getInstance(Context context) {
if (instance != null) {
instance = new AppManager(context);
}
return instance;
}
}
- 非靜態(tài)內部類(匿名類等)創(chuàng)建靜態(tài)實例造成的內存泄漏 Handler/Thread/AsyncTas等
可以使用靜態(tài)內部類+弱引用避免泄漏
public class MainActivity extends AppCompatActivity {
private static TestResource mResource = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(mResource == null){
mResource = new TestResource();
}
//...
}
class TestResource {
//...
}
}
- 資源未關閉造成的內存泄漏
對于使用了BraodcastReceiver,ContentObserver,F(xiàn)ile,Cursor,Stream,Bitmap, 屬性動畫或循環(huán)動畫等資源,應該在Activity銷毀時及時關閉或者注銷,否則這些資源將不會被回收,從而造成內存泄漏。
其中Bitmap使用不當,bitmap對象使用的內存較大,當我們不再使用Bitmap對象的時候一定要執(zhí)行recycler方法,這里需要指出的是當我們在代碼中執(zhí)行recycler方法,Bitmap并不會被立即釋放掉,其只是通知虛擬機該Bitmap可以被recycler了。
集合容器中的內存泄露
我們通常把一些對象的引用加入到了集合容器(比如ArrayList)中,當我們不需要該對象時,并沒有把它的引用從集合中清理掉,這樣這個集合就會越來越大。如果這個集合是static的話,那情況就更嚴重了。
解決方法:在退出程序之前,將集合里的東西clear,然后置為null,再退出程序。靜態(tài)變量持有的應用
view持有context的
https://blog.csdn.net/north1989/article/details/51999920
https://blog.csdn.net/u013495603/article/details/50696170
https://blog.csdn.net/mxm691292118/article/details/51020023