内存优化-理论基础 - 图1

一、Java内存管理机制↓

1.Java对象在虚拟机中的生命周期

摘自《Android进阶解密》p270

Java对象被类加载器加载到虚拟机中后,Java对象在Java虚拟机中有7个阶段。

  1. 创建阶段(Created)

    创建阶段步骤:

    • 为对象分配存储空间
    • 构造对象
    • 从超类到子类对static成员进行初始化
    • 递归调用超类构造方法
    • 调用子类的构造方法
  2. 应用阶段(In Use)

    当对象被创建,分配给变量赋值时,状态切换到应用阶段。这个阶段的对象有个特点:至少持有一个强引用,或者使用软引用,弱引用,虚引用。

  3. 不可见阶段(Invisible)

    此阶段的对象不被任何强引用持有,比如程序的执行超出了该对象的作用域。但是该阶段的对象可能被特殊的强引用GC Roots持有,GC无法回收从而导致内存泄露,比如本地方法栈中的JNI引用或被运行中的线程引用等。

  4. 不可达阶段(Unreachable)

    该阶段中的对象不被任何强引用持有,并且GC发现对象不可达。

  5. 收集阶段(Collected)

    GC发现对象不可达,并且GC已经准备好对该对象的内存空间重新进行分配,这个时候如果该对象重写了finalize方法,则会调用该方法。

  6. 终结阶段(Finalied)

    此阶段说明对象进入终结阶段,等待GC回收该对象空间。对象执行finalize方法后仍然处于不可达状态,或者对象没有重写finalize方法。

  7. 对象空间重新分配阶段(Deallocated)

    此阶段GC会对对象的内存空间进行回收或再分配时,对象就会彻底的消失。

思考:
被标记为不可达的对象会立即被GC回收吗?

不会,从5-7阶段发现:被标记为不可达的对象会进入收集阶段,这时会执行该对象重写的finalize方法,如果没有重写finalize方法或finalize方法中没有重新与一个可达对象进行关联才会进入此阶段,并最终回收。

2.Java内存分配模型

警告⚠️:此处需要计算操作系统理论基础
不错的博客:

嘿,同学,你要的 Java 内存模型 (JMM) 来了 Android内存管理(JVM 、DVM(dalvik) 、ART简单介绍)

3.Java内存回收算法

二、Android内存管理机制↓

Google官方资料

1.Android内存分配模型

1.1DVM

1.2ART

2.Android内存回收机制

博客/书籍

Android性能优化之内存优化
深入探索 Android 内存优化(炼狱级别-上)
深入探索 Android 内存优化(炼狱级别-下)
《深入理解Java虚拟机-第二版》周志明

https://www.dbhc-doman.club/archives/359/memory-optimization/