安卓怎么清理内存(Android优化———内存优化)

35小吃技术网 推荐阅读 2022年10月02日06时33分36秒 328 0

如何清理安卓的内存(安卓优化-内存优化)

java虚拟机

Java内存模型

虚拟机栈(线程私有):局部变量表、操作数栈、动态链接、方法出口等信息。

堆(线程共享):实例对象

方法(线程共享):类信息,常量,由即时编译器编译的代码。

安卓怎么清理内存(Android优化———内存优化)-第1张图片

程序计数器(线程私有):字节码行号指示器,记录当前线程已经执行了多少行。

本地方法栈(thread private):类似于虚拟机栈,两者的区别在于虚拟机栈为虚拟机执行java方法服务,本地方法栈为虚拟机执行native方法服务。

程序计数器

如果java方法正在线程中执行,计数器记录当前指令的地址,

如果是本机方法,计数器记录为空

大量

堆内存=新一代(1)+老一代(2)

新一代:复制算法

安卓怎么清理内存(Android优化———内存优化)-第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