安卓内存优化

JVM堆区的基本原理:

1.堆区的数据结构设计分为年轻代与老年代
年轻代占比三分之一      老年代占比三分之二
年轻代里面分为Eden区(占比百分之80)以及Survivor区(占比百分之20)
Survivor区里面又分为From区(占比Survivor的百分之50)和To区(占比百分之50)
以上都是书上面写的,但是具体开发中占比其实不是这样的

2.对象的生产过程:
(1) new出来一个对象之后,它会先放到Eden区,当不断new出对象后,Eden区就会放满.
一旦放满了之后就会呼叫一个叫minor gc的进程,之后这个进程就会来扫描年轻代.

(2) 扫描的过程:先看Eden区 加上 Survivor区的一半(比如一个From),看哪些对象可以进行回收,就会把这些对象回收走,不能回收的就会把对象头上面的2进制位(4位2进制数比如0001)加1(变成了0010)。不能回收的会保存到Survivor区的另外一半了 能回收的就全部回收掉了。再生产对象的又会向Eden区里面存放数据,Eden区放满之后又会呼叫minor gc进程,它又会扫描Eden区加上Survivor区的另外一半(To区) 不能回收的就把整数加1(这个整数叫分代年龄)移动到from区
把能回收的再全部清空掉.

(3) 就这样左右左右来回清除,这样Survivor区也会有放满的时候,放满的时候会移动到老年代,还有一种情况就是年龄达到6岁也会移动到老年代,老年代放满了之后就会呼叫另外一个进程,full gc
full gc就会对整个堆区进行一个回收  把能回收的收掉不能回收的就留下来了.
(4) 查看对象头:

Grade里面导入库 implementation group: 'org.openjdk.jo1', name: 'jo1-core', version: '0.9'


Student student = new Student();
System.out.println(ClassLayout.parseInstance(student).toPrintable());

上面输出的就是对象头了.
(5) 对象的回收会进行两次GC的标识过程才会回收.(所有的线程在进行GC标识的时候会暂停,暂停时间大概在100ms左右)一旦暂停,就是stop the world,所以在短暂的时间内引发了多次GC,应用就会造成卡顿.

可达性分析以及回收算法简述:

确定一个对象能不能被回收,如果可以回收那么用什么方式进行回收呢?

1. 年轻代一个对象能不能被回收(复制算法)
如果一个对象属于GC Roots(对象头有一个2进制位,标识成了1就是GC Roots)
如果是GC Roots的话整个引入链条上面的对象都是不能被回收的.

2. 什么对象属于GC Roots呢?
(1) 方法区里面用static标识的(不管是类还是常量).
(2) 正在执行过程中方法中的局部变量表中间还没有释放的对象 

3. 总结年轻代回收机制

总结来说就是一个对象的引用链,比如这个对象存在堆区里面,他的引用链有一个引用在栈区或者方法区能够找的到,那么这个方法就不能被回收了.所以GC的算法就比较简单了,从对象的引用链向上搜索.只要搜索有一个对象的对象头上面标识为1他就不会被回收了.年轻代采用的是复制算法。速度是比较快的.数据链的空间很小,所以为了节省空间,而且还没有内存碎片.

4. 老年代采用标记清除算法
它会在里面去找,找到能回收的就直接回收掉了.老年代里面碎片比较多(标记清除算法造成的),这些碎片会引发一个内存问题.
比如回收后有连续10个内存空间可以使用(原来是很多个,因为碎片化之后不定位的占用格子,所以连续可用的变少了),new了一个对象之后需要11格内存空间放到老年代之后就会引发OOM(OOM的引发不一定是哪一块内存空间不足了,当你放进去的数据如果找不到连续的内存空间也会引发)


常见的内存问题


1. OOM
(1) 栈或堆不够用的时候
(2) 申请的空间在内存中无连续的空间可分配.
2. 抖动
(1) 内存频繁的申请和回收(回收是GC来回收的)
(2) 申请次数太多会引发GC,同时还会引发卡顿
(3) 申请的速度大于回收速度时,最终会产生OOM
3. 泄漏
(1) 一个长生命周期的对象持有一个短生命周期的强引用

一般OOM都是由抖动以及泄漏造成的
抖动问题的查找(工具:Android Studio自带的Profiler):
首先运行到界面,然后截取一段内存进行查看多出来了多少个对象或是变量,之后进行点击会有提示在代码哪个位置,之后进行修改
内存泄漏问题的查找(工具:MAT)
在Activity开始的时候下载一段内存进行保存,之后再启动其他Activity(或者跳转其他界面)
最后再回到最开始的Activity再截取一段内存进行保存.
通过MAT工具对第一次以及第二次进行比较,进行查找多出来的数据,就是内存泄漏.

常见代码产生的内存问题

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值