Android面试准备——Android 运行时数据堆区
2021-03-19 本文已影响0人
So_ProbuING
JVM虚拟机结构
image.png-
程序计数器:相当于代码执行的指示器,用于指示下一次代码的执行。所以每一个线程都有自己的线程计数器。
程序计数器 - 对于一个栈来说,都是FILO(先进后出)的特点
-
栈帧:为每一个方法划分的一块执行用的空间,
操作栈 - 局部变量表:存放运行时的局部变量
- 操作数栈:用于进行操作局部变量的栈空间
- 动态链接:用于找方法的动态入口,例如多态形式的方法调用
内存抖动
内存抖动的原因
内存抖动的产生因素时:频繁的分配与回收对象
内存抖动的反应
内存抖动内存抖动对APP产生的影响:
- 会对APP的运行UI产生卡顿的现象
因为内存频繁的分配与回收,需要频繁的调用GC,GC会进行STW(STOP THE WORLD),使得线程中断 所以会造成界面卡顿
GC回收过程
- 更严重的会出现OOM
清理老年代对象的时候采用标记清除算法,会产生内存碎片,再申请新的内存时候会出现不够的情况,就会产生OOM
内存抖动的检测
- 官方提供的Android Profile
内存抖动的解决
核心思想
由于内存抖动是频繁的创建对象,导致了GC频繁的回收对象,频繁启动进行STW,所以处理内存抖动的核心就是减少不必要的对象创建与优化对象的创建
- 使用对象池创建对象
内存泄漏问题
什么是内存泄漏
- 大量对象无法被释放,该回收的对象没有回收
虚拟机采用可达性分析法来确定一个对象是否可以被回收。通过一些列被称为GCRoots的对象作为起始点,从这些节点向下搜索。搜索所有的引用链,当一个对象到GC Roots没有任何引用链(即GC Roots到对象不可达)时,则证明此对象是不可用的。
GC Roots
链接:java中的引用类型
-
强引用 Object
-
软引用 SoftReference 软引用定义一些还有用但并非必须的对象,对于软引用关联的对象。GC不会直接回收,而是在系统将要内存溢出之前触发GC将这些对象进行回收,不会导致GC无法回收对象,非必须但还有用的对象比较适用
-
弱引用 WeakReference 同样定义非必须对象。被弱引用关联的对象在GC执行时会直接被回收,希望如果不用了对象就及时回收就用弱引用,但是弱引用的对象存在null风险
-
虚引用
对于Android来说,无论是软引用还是弱引用都表现的并不可靠
如何检查是否存在内存泄漏
- 官方Android Profile
- Eclipse MAT 查看hprof文件
- leakcananry