android中内存泄漏及溢出

这篇文章只是作为android内存溢出相关知识的一个简单梳理以及面试准备,并没有过多的深入例如场景说明、代码展示等,感兴趣的同学可以针对每一点深入研究。可能有不对的地方,欢迎指正,本人也是小白一枚。。。。

基本概念

内存泄漏:指由于疏忽或错误造成程序未能释放已经不再使用的内存。
内存溢出:是指程序在申请内存时,没有足够的内存空间供其使用。内存泄漏是造成内存溢出的大部分原因但不是全部

GC相关知识

1. java内存模型(方法区、堆、jvm桟、本地方法桟、计数器)不同内存区域有不同的作用,以及专门的存储数据,比如方法区存储静态变量、常量、类信息等,GC负责管理回收,回收频率比较低、堆存储对象、数组等 ,GC负责管理回收,内存泄漏以及内存溢出一般是指该区域;jvm桟主要是方法入口、局部/全局变量引用等
2. 引用类型(强、软、弱、虚)Jvm对不同类型引用采用不同的回收机制,强引用不会被回收,软引用内存不足的时候回收(可能 新老代都没有足够空间的时候)、弱引用是GC发现就会回收、虚引用主要用于堆栈信息跟踪
3. 垃圾标记算法:引用计数法(缺点:循环引用)、根搜索法(GC root选择:四种)
4. 回收算法:标记-整理、标记清除、复制、分代(内存分代,不同代采用不同算法)

内存泄漏场景

泄漏的根本原因:引用对象的生命周期 > 被引用对象的生命周期
解决方法:使 引用对象的生命周期 <= 被引用对象的生命周期

1. static (单例)生命周期比较长,如果引用了非静态的对象则导致非静态对象无法回收(应用程序的生命周期),如果非要引用可以用软/弱引用、或者使用长生命周期的对象比如application
2. 非静态内部类引用外部类,如果非静态内部类或者匿名内部类生命周期大于外部类则会导致泄漏,可以使用静态内部类+软/弱引用 或者 在外部类销毁的时候一并销毁内部类对象
3. 子线程没有销毁,主线程类对象被销毁,子线程还在运行导致主线程类对象不能回收和2比较像
4. 集合中的对象没有移除,对象虽然被置null,但集合中仍引用着对象,所以不能被回收
5. handle消息以及view的postDelay,和2中很像,不过这种场景在android比较常见,onDestory中及时remove掉消息或者任务
6. 资源没有释放(bitmap、cursor、broadcastreceiver、文件流)
7. 尽量避免创建没必要的对象,特别是循环中,减少GC负担
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...
    _痞子阅读 5,552评论 0 8
  • 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏大家都不陌生了,简单粗俗的讲,...
    DreamFish阅读 4,206评论 0 5
  • 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏大家都不陌生了,简单粗俗的讲,...
    宇宙只有巴掌大阅读 7,017评论 0 12
  • 被文同时发布在CSDN上,欢迎查看。 APP内存的使用,是评价一款应用性能高低的一个重要指标。虽然现在智能手机的内...
    大圣代阅读 10,288评论 2 54
  • 读《唐浩明点评曾国藩日记》 咸丰十一年八月十七日 傍夕,思州县之道,以四者为最要:一曰整躬以治署内,一曰明刑以清狱...
    读行人声阅读 1,342评论 0 1

友情链接更多精彩内容