Android性能优化篇——内存泄漏和OOM

本文探讨Android性能优化中的内存泄漏和内存溢出问题,包括它们的定义、危害,以及检测和避免内存泄漏的方法。介绍了通过ActivityManager获取app的堆内存阈值,并列举了常见内存泄露场景,如非静态内部类、单例模式、Handler、线程和资源未关闭,并提供了相应的解决方案。
摘要由CSDN通过智能技术生成
Android性能优化篇——内存泄漏和OOM
老规矩,在讲解以前先提出问题:
(1)什么是内存泄漏?什么是内存溢出
(2)如何检测app的最大堆内存?
(3)如何测量内存泄漏?
(4)如何避免内存泄漏?
好了,直接进入主题。

一、内存泄漏和内存溢出
        1、内存泄漏
            内存泄漏是指某些对象本应该被GC回收,但是由于他们的引用被其他对象持有而导致GC回收失败,从而无法回收占用的内存,结果导致这些无用对象仍然占据着堆中的内存空间,成为内存泄漏。
            内存泄露的危害:
        (1)过多的内存泄露会导致内存被过多占用,容易发生OOM
        (2)内存泄露可能给会导致内存不足,然后频发发生GC,可能会导致UI卡顿,线程停止等问题。
        2、内存溢出
            Android为每个进程会设置一个内存的阈值,如果超过这个阈值则会发生内存溢出,程序就会崩溃。
            内存溢出的危害:
            程序可能会崩溃,为什么是可能,因为内存溢出可以被try——catch。

二、app的堆内存阈值
        这里的阈值与设备有关系,所以不是一个固定的数值。
        通常我们可以通过两个参数来查看我们堆内存阈值:
        heapsize  设备分给堆内存的最大堆内存
        maxheapsize    用于特殊情况下(设置了清单文件中的application的属性largeHeap = true)时才有的最大堆内存,一般为heapsize的2~3倍,设置后则最大堆内存为maxheapsize、
        那么如何获取这两个值:
ActivityManager manager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
int heapSize = manager.getMemoryClass();
int maxHeapSize = manager.getLargeMemoryClass();  // manafest.xml   android:largeHeap="true"

三、如何检测内存泄露
        可以通过As的profiler+facebook的开源库 leakcanary来分析
 
二、常见的内存泄露场景
        1、非静态内部类的内存泄露
             原因:
              非静态内部类会持有外部类的this引用,因此可以访问外部类的静态和非静态变量。如果内部类的生命周期超过外部类,则会导致外部类无法被及时回收
             解决方法:
               创建static静态变量,并通过弱引用WeakReference来引用外部资源
        2、单例模式持有Activity的引用
               原因:
                在单例模式中,如果传入Activity的Context,那么在Activity退出时,由于Context持有Activity的引用,因此导致Activity不会被回收
              解决方法:
                 改为Application的Context
        3、Handler造成的内存泄露
                    我们常见的写法是:

 private Handler mHandler = new Handler() {
        @Override
        
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值