首先咱們來解釋下兩個名詞:java
當一個對象在程序執行事後已經不須要再使用了,可是有其餘的對象還持有該對象的引用,以至該對象不能被GC回收,那麼這個對象會一直佔用內存,從而致使該內存不可用,這種本該被GC回收(再也不須要用了)而又不能被回收(被其餘對象持有引用),以至停留在堆內存中的對象就形成了內存泄露.數組
內存溢出(OutOfMeory),即咱們一般所說的OOM,是指程序在申請內存時,沒有足夠的內存空間共其使用.緩存
// 使用了單例模式
// 若是Context使用的是Activity的Context,則會形成內存溢出
//單例的Context 使用Application的Context,單例的生命週期和應用的同樣長,這樣基本能夠防止單例引發來的內存泄露內存泄漏。
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;
}
}
複製代碼
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 { //... } }
複製代碼
public class MainActivity extends AppCompatActivity {
private final Handler handler = new Handler() {
@Override public void handleMessage(Message msg) {
//
... }
};
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new Runnable() {
@Override public void run() {
// ...
handler.sendEmptyMessage(0x123);
}
});
}
複製代碼