开发者社区> 问答> 正文

[@小川游鱼][¥20]何时会内存泄漏,内存泄漏会抛哪些异常

何时会内存泄漏,内存泄漏会抛哪些异常

展开
收起
月下丶 2018-12-14 22:56:15 2660 0
1 条回答
写回答
取消 提交回答
  • 阿里云问答专家、阿里云认证云计算工程师、Java研发工程师

    何时会内存泄漏:

    一.资源释放问题:

    程序代码的问题,长期保持某些资源,如Context,Cursor,IO流的引用,资源得不到释放造成内存泄漏.

    二.对象内存过大:

    保存了多个耗用内存过大的对象,如 Bitmap,XML文件,造成内存超出限制。

    三.static关键字的使用问题:

    static是java中的一个关键字,当用它修饰成员变量时,那么该变量就属于该类,而不是该类的实例。所以用static修饰的变量,它的生命周期是很长的,如果他用来引用一下资源耗费过多的实例(Context的情况最多),这时就要谨慎对待。
    -------针对static的解决方案:1)应该尽量避免static成员变量引用资源耗费过多的实例。如Context。2)Context尽量使用ApplicationContext,因为Application的Context的生命周期比较长,引用它不会出现内训泄漏的问题。3)使用WeakReference代替引用,比如可以使用WeakReference mContextRef.

    四.线程导致内存溢出:

    线程产生内存泄漏的主要原因是在于线程的生命周期不可控。
    -------针对这种线程的内存泄漏问题的解决方案:1)将线程的内部类(因为非静态内部类拥有外部类对象的强引用,而静态类则不拥有)。2)在线程内部采用弱引用保存Context的引用。

    五.查询数据库没有关闭cursor:

    程序中经常用到会进行查询数据库的操作,但是经常会使用完毕Cursor后没有关闭的情况,如果我们的查询结果集比较小,对内存的消耗不容易被发现,只有在长时间大量操作的情况下才会出现内存问题,这样就会给以后的测试和问题排查带来困难和风险。

    六.构造Adapter没有复用ConvertView:

    在使用listview的时候通常使用Adapter,那么 我们应该尽可能的使用ConvertView。为什么要复用ConvertView?当ContertView为空时,用setTag()方法为每一个View绑定一个存放控件的ViewHolder对象,当convertVIew不为空,重复利用已经创建的view的时候,使用getTag()方法获取绑定的ViewHolder对象,这样就避免了findViewById对控件的层层查询,而是快速定位到控件。

    七.Bitmap不在使用时没有调用recycle()释放内存:

    有时我们会手动的操作Bitmap对象比较占内存,当它不在被使用的时候,可以调用Bitmap.recycle()方法回收此对象的像素所占的内存,但这不是必须的,视情况而定。

    内存泄漏会抛哪些异常: OutOfMemoryError异常

    2019-07-17 23:21:45
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
内存取证与IaaS云平台恶意行 为的安全监控 立即下载
云服务器ECS内存增强型实例re6全新发布 立即下载
低代码开发师(初级)实战教程 立即下载