这篇文章只是作为android内存溢出相关知识的一个简单梳理以及面试准备,并没有过多的深入例如场景说明、代码展示等,感兴趣的同学可以针对每一点深入研究。可能有不对的地方,欢迎指正,本人也是小白一枚。。。。
基本概念
内存泄漏:指由于疏忽或错误造成程序未能释放已经不再使用的内存。
内存溢出:是指程序在申请内存时,没有足够的内存空间供其使用。内存泄漏是造成内存溢出的大部分原因但不是全部
GC相关知识
1. java内存模型(方法区、堆、jvm桟、本地方法桟、计数器)不同内存区域有不同的作用,以及专门的存储数据,比如方法区存储静态变量、常量、类信息等,GC负责管理回收,回收频率比较低、堆存储对象、数组等 ,GC负责管理回收,内存泄漏以及内存溢出一般是指该区域;jvm桟主要是方法入口、局部/全局变量引用等
2. 引用类型(强、软、弱、虚)Jvm对不同类型引用采用不同的回收机制,强引用不会被回收,软引用内存不足的时候回收(可能 新老代都没有足够空间的时候)、弱引用是GC发现就会回收、虚引用主要用于堆栈信息跟踪
3. 垃圾标记算法:引用计数法(缺点:循环引用)、根搜索法(GC root选择:四种)
4. 回收算法:标记-整理、标记清除、复制、分代(内存分代,不同代采用不同算法)
内存泄漏场景
泄漏的根本原因:引用对象的生命周期 > 被引用对象的生命周期
解决方法:使 引用对象的生命周期 <= 被引用对象的生命周期