参考链接: http://www.jianshu.com/p/0049e9b344b0
参考链接: https://corner.squareup.com/2015/05/leak-canary.html
参考1:http://www.cnblogs.com/androidsuperman/p/0bdb7806bd5ff9c3edbdef9a913eae6f.html
参考2:http://m.blog.csdn.net/article/details?id=50521600
eclispe版LeakCanary下载:http://download.csdn.net/detail/liudehuaii18/8756841
android studio版 LeakCanary下载:https://github.com/liaohuqiu/leakcanary-demo
中文文档:http://www.liaohuqiu.net/cn/posts/leak-canary-read-me/
Why:http://www.liaohuqiu.net/cn/posts/leak-canary/
bitmap直接放到内存也可能直接引起OOM,这时候我们就不能说是内存泄露导致的OOM了,常见的引起OOM的原因大概有以下几种:
1,bitmap太大或者bitmap用完没有回收
2,数据库的cursor没有关闭
3.构造adapter时,没有使用缓存contentview
4,死循环或者递归
除此之外,还有下面错误示例:public classSaveDate {
private static SaveDate SAVEDATE;
//上下文privateContextcon;
static SharedPreferencessharedPreferences;private SaveDate(Context con) {
this.con= con;
} /*** * 得到一个单例对象
***/
public staticSaveDate getInstence(Context con) {
if (SAVEDATE==null) {
SAVEDATE = new SaveDate(con);
}
if (sharedPreferences==null) {
sharedPreferences = con.getSharedPreferences("saveDate", Context.MODE_WORLD_WRITEABLE);
}
return SAVEDATE;
}
}
使用eventbus传递消息,是可以避免一些自己代码中的内存泄漏,使用方法
参见:http://blog.csdn.net/harvic880925/article/details/40660137
public class MainActivity extends Activity {
Button btn;
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
btn = (Button) findViewById(R.id.btn_try);
tv = (TextView)findViewById(R.id.tv);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(getApplicationContext(),
SecondActivity.class);
startActivity(intent);
}
});
}
public void onEventMainThread(FirstEvent event) {
String msg = "onEventMainThread收到了消息:" + event.getMsg();
Log.d("harvic", msg);
tv.setText(msg);
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}
@Override
protected void onDestroy(){
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
public class SecondActivity extends Activity {
private Button btn_FirstEvent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
btn_FirstEvent = (Button) findViewById(R.id.btn_first_event);
btn_FirstEvent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
EventBus.getDefault().post(
new FirstEvent("FirstEvent btn clicked"));
}
});
}
}
public class FirstEvent {
private String mMsg;
public FirstEvent(String msg) {
// TODO Auto-generated constructor stub
mMsg = msg;
}
public String getMsg(){
return mMsg;
}
}