一、Java内存管理机制↓
1.Java对象在虚拟机中的生命周期
摘自《Android进阶解密》p270
Java对象被类加载器加载到虚拟机中后,Java对象在Java虚拟机中有7个阶段。
创建阶段(Created)
创建阶段步骤:
- 为对象分配存储空间
- 构造对象
- 从超类到子类对static成员进行初始化
- 递归调用超类构造方法
- 调用子类的构造方法
应用阶段(In Use)
当对象被创建,分配给变量赋值时,状态切换到应用阶段。这个阶段的对象有个特点:至少持有一个强引用,或者使用软引用,弱引用,虚引用。
不可见阶段(Invisible)
此阶段的对象不被任何强引用持有,比如程序的执行超出了该对象的作用域。但是该阶段的对象可能被特殊的强引用GC Roots持有,GC无法回收从而导致内存泄露,比如本地方法栈中的JNI引用或被运行中的线程引用等。
不可达阶段(Unreachable)
该阶段中的对象不被任何强引用持有,并且GC发现对象不可达。
收集阶段(Collected)
GC发现对象不可达,并且GC已经准备好对该对象的内存空间重新进行分配,这个时候如果该对象重写了finalize方法,则会调用该方法。
终结阶段(Finalied)
此阶段说明对象进入终结阶段,等待GC回收该对象空间。对象执行finalize方法后仍然处于不可达状态,或者对象没有重写finalize方法。
对象空间重新分配阶段(Deallocated)
此阶段GC会对对象的内存空间进行回收或再分配时,对象就会彻底的消失。
思考:
被标记为不可达的对象会立即被GC回收吗?
不会,从5-7阶段发现:被标记为不可达的对象会进入收集阶段,这时会执行该对象重写的finalize方法,如果没有重写finalize方法或finalize方法中没有重新与一个可达对象进行关联才会进入此阶段,并最终回收。
2.Java内存分配模型
警告⚠️:此处需要计算操作系统理论基础
不错的博客:
嘿,同学,你要的 Java 内存模型 (JMM) 来了 Android内存管理(JVM 、DVM(dalvik) 、ART简单介绍)
3.Java内存回收算法
二、Android内存管理机制↓
1.Android内存分配模型
1.1DVM
1.2ART
2.Android内存回收机制
博客/书籍
Android性能优化之内存优化
深入探索 Android 内存优化(炼狱级别-上)
深入探索 Android 内存优化(炼狱级别-下)
《深入理解Java虚拟机-第二版》周志明
https://www.dbhc-doman.club/archives/359/memory-optimization/
