Android垃圾回收机制

1.垃圾回收机制

垃圾回收,也叫GC(Garbage Collection),指的是释放垃圾占用的空间,防止内存泄露。有效的使用可以使用的内存,对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。

JVM的内存区域主要分为程序计数器、虚拟机栈、本地方法栈、方法区、堆。其中堆区才是GC作用的区域,其他几个数据区域都不进行GC。对象实例和数组都是在堆上分配的,GC也主要对这两类数据进行回收。

一般,程序使用内存的方式遵循先向操作系统申请一块内存、使用内存、使用完毕之后释放内存归还给操作系统。在传统的C/C++等要求显式释放内存的编程语言中,记得在合适的时候释放内存。而Java等编程语言都提供了基于垃圾回收算法的内存管理机制,不再需要手动释放对象的内存,JVM中的垃圾回收器(Garbage Collector)会自动回收。

Android如今使用的虚拟机名叫Android Runtime,简称Art,而Art的其中一大职责就是负责垃圾回收。Art会在适当的时机触发GC操作,一旦进行GC操作,就会将一些不再使用的对象进行回收。

2.如何判定垃圾

目前主要有两种判定算法:引用计数算法和可达性分析算法。Art采用的是第二种算法。

①引用计数算法

引用计数算法通过在对象头中分配一个空间来保存该对象被引用的次数。如果该对象被其它对象引用,则它的引用计数加1,如果删除对该对象的引用,则它的引用计数减1,当该对象的引用计数为0时,该对象就会被回收。

注意,引用有四种类型分别是强引用、软引用、弱引用和虚引用。引用的类型会影响到垃圾的回收。

(1)强引用:通过new创建一个新对象时返回的引用就是一个强引用,若一个对象通过一系列强引用可到达,它就是强可达的(strongly reachable),那么它就不可能被系统垃圾回收机制回收。

(2)软引用:垃圾回收机制运行时,系统内存空间足够不会被回收,不足够会被回收。软引用和弱引用的区别在于,若一个对象是弱引用可达,无论当前内存是否充足它都会被回收,而软引用可达的对象在内存不充足时才会被回收,因此软引用要比弱引用“强”一些;

(3)弱引用:垃圾回收机制运行时,不管系统内存是否足够,都会被回收。

(4)虚引用:几乎等于没有引用,以至于我们通过虚引用甚至无法获取到被引用的对象。虚引用存在的唯一作用就是当它指向的对象被回收后,虚引用本身会被加入到引用队列中,用作记录它指向的对象已被回收。

下面通过实例来演示和说明:

String obj = new String("Android");

该段代码先创建一个字符串Android,其内存分在堆中,并且这个时候"Android"有一个引用,就是obj,它指向字符串Android。

如果此时将obj设置为null,这时候“Android”字符串的引用次数就为0了,在引用计数垃圾回收中,意味着此时就要进行垃圾回收了。

obj = null;

此时演示的示意图如下所示,即将进行垃圾回收。

引用计数算法有一个致命问题就是不能解决循环引用问题。

②可达性分析算法

可达性算法的原理是以一系列叫做GC Root的对象为起点出发,引出它们指向的下一个节点,再以下个节点为起点,引出此节点指向的下一个结点(这样通过GC Root串成的一条线就叫引用链),直到所有的结点都遍历完毕。如果相关对象不在任意一个以GC Root为起点的引用链中,则这些对象会被判断为垃圾,会被GC回收。

非Java内存的垃圾回收
除了Java对象,Android应用程序还使用大量的非Java内存,如Bitmap、JNI对象和资源等。由于这些对象不受Java垃圾回收机制的管理,因此需要专门的垃圾回收机制来进行处理。

在非Java内存的垃圾回收中,主要涉及Bitmap的回收。Bitmap是一种占用大量内存的对象,使用不当容易引起内存问题。Android提供了一种bitmap.recycle()方法来释放Bitmap对象所占用的内存空间。如果在应用退出前手动将所有Bitmap回收,则可以避免内存泄漏和应用崩溃等问题。

总的来说,Android虚拟机垃圾回收机制是通过Java内存和非Java内存的垃圾回收机制来有效地管理内存,提高系统性能和稳定性。在实际应用中,程序员需要根据实际需求来合理地使用内存和垃圾回收机制,以避免出现内存泄漏和应用崩溃等问题。

android的垃圾回收机制原理,Android 垃圾回收机制-CSDN博客

相关推荐

  1. Android垃圾回收机制

    2024-03-15 13:34:03       42 阅读
  2. 深入了解Android垃圾回收机制

    2024-03-15 13:34:03       53 阅读
  3. C++垃圾回收机制

    2024-03-15 13:34:03       39 阅读
  4. jvm | 垃圾回收机制

    2024-03-15 13:34:03       51 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-15 13:34:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-15 13:34:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-15 13:34:03       82 阅读
  4. Python语言-面向对象

    2024-03-15 13:34:03       91 阅读

热门阅读

  1. Unity3D MMORPG角色的UI血条管理详解

    2024-03-15 13:34:03       45 阅读
  2. linux下如何hook第三方播放器的视频数据?

    2024-03-15 13:34:03       37 阅读
  3. Ubuntu 根分区扩容

    2024-03-15 13:34:03       40 阅读
  4. RockChip Android13 修改U盘挂载目录

    2024-03-15 13:34:03       42 阅读
  5. 【笔记】学习Android.mk(四)

    2024-03-15 13:34:03       39 阅读
  6. 每天一个数据分析题(二百零六)

    2024-03-15 13:34:03       39 阅读
  7. jffs2文件系统挂载到Ubuntu,制作新的jffs2文件系统

    2024-03-15 13:34:03       39 阅读
  8. PyTorch学习笔记之基础函数篇(八)

    2024-03-15 13:34:03       31 阅读
  9. 实现两栏布局

    2024-03-15 13:34:03       35 阅读
  10. 基于Python的pygame库的五子棋游戏

    2024-03-15 13:34:03       30 阅读
  11. 大数据开发(Kafka面试真题-卷三)

    2024-03-15 13:34:03       41 阅读