android中内存泄漏及溢出

作者: YYOmomo | 来源:发表于2018-02-28 17:08 被阅读0次

这篇文章只是作为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负担

相关文章

  • Android 优化

    Android 内存优化内存溢出 , 内存泄漏 , 内存泄漏过多就导致内存溢出 Android 系统垃圾回收机制内...

  • android中内存泄漏及溢出

    这篇文章只是作为android内存溢出相关知识的一个简单梳理以及面试准备,并没有过多的深入例如场景说明、代码展示等...

  • Android内存泄漏原因及解决的总结

    分三步说明Android内存泄漏的原因及解决,“内存泄漏与内存溢出的区别”,“引用方式”,“常见引发原因与解决方案...

  • leakcanery2源码

    LeakCanary是Android上用于检查内存泄漏的工具,LeakCanary大大减少因内存泄漏导致的内存溢出...

  • 面试总结 | 记一次Android 面试

    Android中的内存泄漏和内存溢出有什么区别?内存溢出是指程序在申请内存的时候,没有足够的内存可以分配,导致Ou...

  • 面试经历:记一次Android面试

    Android中的内存泄漏和内存溢出有什么区别? 内存溢出是指程序在申请内存的时候,没有足够的内存可以分配,导致O...

  • (转载自diycode)2017 Android 面试题分享整理

    Android(安卓) Android基础知识 Android内存泄漏总结 Handler内存泄漏分析及解决 An...

  • 内存溢出和内存泄漏

    1.内存泄漏 2.内存溢出 -如何避免内存泄漏、内存溢出?

  • Android 基础

    1、Android布局 2、Android内存泄漏总结 3 、Handler内存泄漏分析及解决 4...

  • Android 内存优化

    Android内存泄露容易导致内存溢出,又称为OOM。 内存泄漏怎么产生的 资源对象没关闭造成的内存泄漏 构造Ad...

网友评论

    本文标题:android中内存泄漏及溢出

    本文链接:https://www.haomeiwen.com/subject/nglixftx.html