当前位置:首页 > 内存 > 正文

android内存泄露(android内存分析工具)

  • 内存
  • 2024-06-10 19:38:36
  • 6849

一、android内存泄露会导致什么问题1、在不关闭游标的情况下查询数据库
游标是Android中非常常用的对象,但是在编写代码时,人们经常忘记调用close,或者由于代码逻辑问题而没有调用close。
通常,Activity可以调用startManagingCursor或直接使用ManagedQuery让Activity自动管理Cursor对象。
不过需要注意的是,一旦引入activity,光标将不再可用!
如果操作Cursor的代码与UI不同步(例如在后台线程上),则无需在调用OnDestroy之前首先检查Activity是否已完成或等待后台线程完成。
以下是游标未关闭的其他常见情况:
看似调用了(),但如果发生异常,则关闭是skipped(),导致错误。内存泄漏。
所以我们的代码应该这样写:
Cursorc=queryCursor();
try{
inta=(1);
。.....
}catch(Exceptione){
}finally{
();//最后调用close()看看是否调用了
}
尝试{
Cursorc=queryCursor();
inta=(1);
......
();
}catch(Exceptione){
}
2.调用registerReceiver后不调用unregisterReceiver()。
如果调用registerReceiver后不调用unregisterReceiver,则共享。内存还是蛮大的。
你经常会看到类似下面的代码:
这是一个非常严重的错误,因为BroadcastReceiver没有注销,发生了内存泄漏。
registerReceiver(newBroadcastReceiver(){
...
},filter);...
tream/OutputStream未关闭。
使用文件或访问网络资源时,使用InputStream/OutputStream可能会导致内存泄漏
4.使用Bitmap后不再调用Recycle()
根据SDK的描述,不需要调用recycle。但在实际使用中,Bitmap占用内存较多,因此当不再使用时,尝试调用recycle()来释放资源。
5.上下文泄漏
这是一种非常模糊的内存泄漏情况。
首先,让我们看下面的代码:
此代码使用静态Drawable对象。
这通常发生在当你需要频繁调用一个Drawable,加载需要很多时间,并且你不想每次Activity加载时都创建这个Drawable时。
此时,使用static无疑是最快的编写代码的方式,但同时也是一种非常糟糕的方式。
当Drawable附加到View时,View通过调用lback()设置为Drawable的回调。
这意味着Drawable有对TextView的引用,而TextView有对Activity的引用。
这确保了Activity销毁后内存不会被释放。
privatestaticDrawablesBackground;
@Override
protectedvoidonCreate(Bundlestate){
te(state);
TextViewlabel=newTextView(this);
t("严重泄漏");
if(sBackground==null){
sBackground=getDrawable(_bitmap);
}
kgroundDrawable(sBackground);
setContentView(标签);
}
二、如何定位和解决Android的内存溢出问题(大总1.定位内存泄漏:
可以使用LeakCanary:检测所有内存泄漏