【Java基础】-- 内存泄漏和内存溢出

一 内存泄漏(Memory Leak)

1 概念
内存泄漏通俗来说就是该释放的对象没有释放,一直被某个或某些实例所持有导致不能正常GC回收。这部分实例占据的内存资源不能释放再次使用,这就叫做内存泄漏。

2 Android开发中常见内存泄漏的场景
(1)单例模式
单例的静态特性使其生命周期和应用的生命周期一样长,如果单例对象持有不再需要使用的对象,就会造成内存泄漏。
(2)非静态内部类创建静态实例
非静态内部类会默认持有外部类的引用,如果该非静态内部类创建了一个静态的实例,如果该静态实例的生命周期和应用一样长,这就导致了该静态实例会一直持有外部类的引用,导致外部类的内存资源不能正常回收。
(3)匿名内部类
匿名内部类会持有所在Activity的隐式引用,如果任务在Activity销毁之前还未完成,那么将导致Activity的内存资源无法被回收,从而造成内存泄漏。
(4)资源未关闭
使用了BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap等资源,应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,从而造成内存泄漏。

3 避免内存泄漏的一些建议
(1)尽量避免内部类,如果无法避免就将内部类改为静态内部类。
(2)保持对对象生命周期的敏感,特别注意单例、静态对象、全局性集合等的生命周期。
(3)正确关闭资源,对于使用了BraodcastReceiver,ContentObserver,File,游标 Cursor,Stream,Bitmap等资源的使用,应该在Activity销毁时及时关闭或者注销。

二 内存溢出(Out of memory、OOM)

1 概念
通俗来讲就是内存不够,程序运行时所需要的内存超出了提供的内存空间。

2 内存溢出的常见场景
(1)数组越界内存溢出()
(2)java堆内存溢出(java.lang.OutOfMemoryError:Java heap space)
(3)垃圾回收超时内存溢出(java.lang.OutOfMemoryError)

三 内存泄漏和内存的区别和联系

1 一个比喻
(1)内存泄漏:你有100元,别人向你借了50元一直没有归还,这50元就是内存泄漏。
(2)内存溢出:你有100元,你想买一件120元的衣服,售货员提示你钱不够买不了,这就内存溢出。

2 关系
内存泄露 → 剩余内存不足 → 后续申请不到足够内存 →内存溢出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值