关于android的内存泄露

内存泄漏:进程中某些对象已经没有使用价值了,但是它们却可以直接或间接地引用到,导致无法被GC回收。无用的对象占据着内存空间,使得实际可使用内存变小,从而导致内存泄漏了。
内存溢出(OOM):程序在申请内存时,没有足够的内存空间供其使用;内存泄漏是导致内存溢出的主要原因之一;
内存泄露的原因主要就是该关闭的资源对象没有即使释放;

1.单例造成的内存泄露
单例的特点是其生命周期与application保持一致
大概大多数的单例都是像这么写的吧
<code>
public class MyTest {
public static MyTest mTest;
private Context mContext;
private MyTest (Context context) {
mContext = context;
}
public static synchronized Test getInstance(Context context) {
if (mTest == null) {
mTest = new MyTest(context);
}
return mTest;
}
}
</code>
①如果传入的是 Activity 的 Context,当这个 Context 所对应的 Activity 退出时,由于该 Context 的引用被单例对象所持有,其生命周期等于整个应用程序的生命周期,所以当前 Activity 退出时它的内存并不会被回收,从而导致了内存泄露;
②当我们传入的是Application的Context的时候,单例的生命周期就和Application的一样长,因为Application的生命周期是贯穿整个程序的,所以MyTest类持有它的引用,也不会造成内存泄露问题。
所以当我们能用Application Context代替的,尽量用Application Context。
2.Bitmap使用不当
Bitmap是一个极容易消耗内存的对象,用完之后要及时回收;
当我们展示图片区域很小的时候,需要对图片进行压缩及降低像素或者加载缩略图等;
运用Glide加载图片的时候,ImageView的scaleType设置不当会导致OOM,当设置为我们fitXY时,Glide不会进行缩放,会以全分辨率加载,所以尽量不要设置为fitXY。
3.Handler造成的内存泄漏
非static的handler会持有activity的引用,而如果handler没有处理完成工作的时候,我们调用finish,则activity不能释放,这个时候就会出现内存泄漏。
平常我用handler是这样使用的:
<code>
public class MainActivity extends AppCompatActivity {
...
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
}
};
}
</code>
但是这样会造成内存泄漏,在Java中在内部创建对象之后会隐式的持有外部对象,也就是说new Handler()之后Handler对象对Activity就有了一个持有,那么此时finish掉Activity的话是没办法回收的。这就造成了内存泄漏。
正确使用handler的姿势应该是这样的:
<code>
static class MyHandler extends Handler {
private final WeakReference<Test> mActivity;
TestHandler(Test activity) {
mActivity = new WeakReference<>(activity);
}
@Override
public void handleMessage(Message msg) {
final Test activity = mActivity.get();
if (activity == null || activity.isFinishing()) {
removeCallbacksAndMessages(null);
return;
}
}
}
</code>
4.匿名内部类造成的内存泄露
<code>
public class TestActivity extends Activity {
...
MyRunnable re1 = new MyRunable();
Runnable re2 = new Runnable() {
@Override
public void run() {
...
}
};
}
</code>
其中re2是匿名内部类,ref2的实现对象里面有个引用,这个引用指向TestActivity ,当前的TestActivity 实例会被re2持有,如果将这个引用再传入一个异步线程,此线程和此Acitivity生命周期不一致的时候,就造成了Activity的泄露。
5.资源性对象未关闭
File,Cursor,Stream,File,Cursor,Stream,BraodcastReceiver,ContentObserver,Bitmap等资源的使用,应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,造成内存泄漏。
6.Webview造成的内存泄露
在重复打开有WebView的页面时,你会发现,应用的内存会不断升高,销毁了之后也不会降下来,这样就出现了内存泄漏了;
使用Webview之后要activity的onDestroy方法中调用webView.removeAllViews()和webView.destroy();new WebView的时候需要传入ApplicationContext,如果传入Activity的Context的话,对内存的引用会一直被保持着;
7.静态变量造成的内存泄露
在 Activity 类中定义一个 static 变量,并将其指向一个运行中的 Activity 实例。如果在 Activity 的生命周期结束之前,没有清除这个引用,那它就会泄漏。由于 Activity 的类对象是静态的,一旦加载,就会在 APP 运行时一直常驻内存,如果类对象不卸载,其静态成员就不会被垃圾回收,应该尽量避免static成员变量引用资源耗费过多的实例;
Android的内存优化的建议:
1 对不用的对象显示置NULL;
2.使用更加轻量的数据结构;
3内存对象的重复利用,一些数据进行缓存;
4 注册监听及时注销;
5 优化布局,减少嵌套层次;
6 Listview的优化ContentView获取缓存的view,使用ViewHolder模。建议用recyclerview代替listview;
7 复用系统自带的资源,如颜色,图片,简单的布局,样式,接口,动画等;

  • ━━━━━━神兽出没━━━━━━
  • ┏┓   ┏┓
  • ┏┛┻━━━┛┻┓
  • ┃       ┃
  • ┃   ━   ┃
  • ┃ ┳┛ ┗┳ ┃
  • ┃       ┃
  • ┃   ┻   ┃
  • ┃       ┃
  • ┗━┓   ┏━┛
  • ┃   ┃
  • ┃   ┃
  • ┃   ┗━━━┓
  • ┃       ┣┓
  • ┃       ┏┛
  • ┗┓┓┏━┳┓┏┛
  • ┃┫┫ ┃┫┫
  • ┗┻┛ ┗┻┛
    *━━━━━━━━━━━━━━━━
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容