安卓怎么清理内存(Android优化———内存优化)
如何清理安卓的内存(安卓优化-内存优化)
java虚拟机
Java内存模型
虚拟机栈(线程私有):局部变量表、操作数栈、动态链接、方法出口等信息。
堆(线程共享):实例对象
方法(线程共享):类信息,常量,由即时编译器编译的代码。
程序计数器(线程私有):字节码行号指示器,记录当前线程已经执行了多少行。
本地方法栈(thread private):类似于虚拟机栈,两者的区别在于虚拟机栈为虚拟机执行java方法服务,本地方法栈为虚拟机执行native方法服务。
程序计数器
如果java方法正在线程中执行,计数器记录当前指令的地址,
如果是本机方法,计数器记录为空
大量
堆内存=新一代(1)+老一代(2)
新一代:复制算法
年龄:标记排序算法
方法区域
也叫“永久生成”,1.8以后,方法区被移除,移到直接内存。
内存回收主要考虑堆区和方法区的回收,其他部分会以线程的生成和死亡为基础。
版本差异
1.6:运行常量池在方法区。
1.7:在堆中运行常量池
1.8:删除方法区,引入直接内存的概念,meta 空。方法区的静态变量被转移到堆中,只有类元数据在meta 空中。
堆中的老龄和方法区(永久代)是绑定的,不管哪边满了,都会触发两边的GC回收。
问题:
栈和栈的区别:栈:基本数据类型变量(int、short、long、byte、float、double、boolean、char)和对象引用变量。堆栈:java对象堆中的对象对所有线程都是可见的,堆栈内存只属于一个线程堆。内存空比栈大很多。
为什么删除方法区域?启动大小固定,很难调优,很容易在本地内存中分配OOM元空。如果本地内存足够,就不会溢出。
垃圾收集
确定对象是否是活的。
计数算法(缺点:循环引用,技能数从不为0)
可达性算法(在二叉树中向下搜索,如果没有引用链,对象将不可用)
恢复算法
标记算法:标记后回收对象。旧时代使用的缺点:效率低,标记和清除效率低,产生大量碎片空,造成空的浪费。
复制算法:将可用对象复制到新的连续空房间,删除之前的空房间。缺点:浪费了50%的内存,复制长寿命对象的效率较低,所以新一代使用这种算法。
标签排序算法:前期使用标签清除算法,后期使用排序算法,使对象按空关系排列,老年使用。
代收集算法:数据分为代,每代执行不同的恢复算法。
年轻一代分伊甸、s0、s1,分别是8: 1: 1,年轻一代和老一代是1: 2。
meta 空中的Gc:如果meta 空中的类加载器存活,那么meta 空中的元数据也存活。
小GC:清理年轻一代大GC:清理老一代全GC:清理整个堆空,包括年轻一代和永久一代。
四大引言简介
简历
强引用:常用的对象方法Strong Reference不会被gc回收。
SoftReference: softreference,内存不足时会回收。
WeakReference:弱引用,将在下一次gc中回收。
虚拟参考:PhantomReference,可以随时回收
在处理内存泄漏问题时,弱引用是应用最广泛的,许多源代码和框架都使用它。
例如:
ThreadLocalMap将ThreadLocal的弱引用存储为key,具体内容为value。
Glide中的缓存使用activeResource,存储图片的弱引用。
使用弱引用解决处理程序的内存泄漏。
理解引用
的所有引用都继承自Reference。以下是WeakReference的一个例子:
publicclassWeakReferenceextendsReference{/***Createsanewweakreferencethatreferstothegivenobject.Thenew*referenceisnotregisteredwithanyqueue.**@paramreferentobjectthenewweakreferencewillreferto*/publicWeakReference(Treferent){super(referent);}/***Createsanewweakreferencethatreferstothegivenobjectandis*registeredwiththegivenqueue.**@paramreferentobjectthenewweakreferencewillreferto*@paramqthequeuewithwhichthereferenceistoberegistered,*ornullifregistrationisnotrequired*/publicWeakReference(Treferent,ReferenceQueue