Dalvik 虚拟机的垃圾收集简介

简介: 首先, Dalvik虚拟机比其他Java虚拟机中的垃圾收集要简单一些, 因为没有进行内存整理(no compacting). 也就是说堆内存中的对象在创建之后其地址永远都不会发生改变, 使得虚拟机其余部分的实现变得相对简单。

首先, Dalvik虚拟机比其他Java虚拟机中的垃圾收集要简单一些, 因为没有进行内存整理(no compacting). 也就是说堆内存中的对象在创建之后其地址永远都不会发生改变, 使得虚拟机其余部分的实现变得相对简单。

而GC会在 分配失败时触发, 包括以下情况:

  1. 触发 OutOfMemoryError 时,
  2. 堆内存的大小到达某些软限制时,
  3. 显式地请求GC时。

每种情况都有相应的标准来标识是否是 partial GC(部分GC, 只回收 active heap), 是否是 concurrent GC (并发GC, 在应用线程运行时执行大部分的对象标记任务), 以及是否是 preserving GC (保留GC, 保留软引用)。

典型的GC是由于内存限制所引起的, 只清理活跃堆,并发型和保留型的GC. 另一种触发GC的原因是 OutOfMemoryException, 是同步的,非保留式的(non-preserving)。

当前(Android 4.x) 使用的是 Mark-Sweep algorithm(标记清除)算法。

Mark-Sweep Algorithm(标记-清除算法)的处理过程

标记和清除算法是编程界第一种能够回收 循环数据结构 的算法。

使用标记-清除算法时, 未引用的对象不会立刻回收。相反,垃圾可以堆积, 直到耗尽所有可用内存。当内存不足时, 程序被暂停执行, 然后标记-清除算法清理所有的垃圾. 当所有未引用的对象被回收后, 再恢复程序的正常运行。

标记-清除算法被称为 ** tracing 垃圾收集器, 因为其追朔( traces out) 所有直接或间接被程序访问的对象。 程序可以直接访问的对象包括: 处理器栈上的局部变量引用的对象, 以及静态变量所引用的对象。 在GC的上下文中, 这些变量被称为 GC根(root)。 间接可访问是指由(直接/间接)对象所引用的对象。可访问对象也被称为 存活对象. 相反, 不再存活的对象就是垃圾。

标记-清除算法分为 两个阶段:

第一阶段,找到所有的可访问对象并标记, 称为 mark 阶段。

第二阶段, 垃圾收集算法扫描整个堆, 并回收所有未标记的对象, 称为sweep阶段。

02_01_mark-and-sweep.png

(a) 显示了垃圾收集之前的情况。在此示例中,只有单个 root 变量。

(b) 显示了 mark 阶段结束时的结果。此时, 所有的存活对象都被标记了。

(c) 显示了 sweep 阶段完成后留下的对象。只有存活对象留在内存中, 所有对象的 marked 字段再次被设置为false。

当然,到 Android5.0 以后, ART GC 的优化改进了Dalvik 虚拟机的很多性能瓶颈; 详情请参考: Android 5.0 ART GC 对比 Android 4.x Dalvik GC

此文也比较好: Android GC 从dalvik到ART的改进分析

原文链接: https://medium.com/@nitinkumargove/how-garbage-collection-works-in-dalvik-vm-in-android-bf781ab48531

翻译人员: 铁锚 http://blog.csdn.net/renfufei

翻译时间: 2017年01月26日

目录
相关文章
|
11月前
|
算法 云计算 虚拟化
硬件加速器IAA的最佳实践解读和libvirt虚拟机热迁移流程简介| 第80-81期
本周二,了解 IAA 加速器的原理及其应用&云上最佳实践;libvirt 虚拟机热迁移整体流程等。
|
存储 算法 Java
Java虚拟机-垃圾回收简介
Java虚拟机-垃圾回收简介
Java虚拟机-垃圾回收简介
|
存储 XML Java
JVM虚拟机-Class文件简介
JVM虚拟机-Class文件简介
109 0
JVM虚拟机-Class文件简介
|
Java Shell 程序员
Android上的Dalvik虚拟机
本文会介绍Andorid系统上曾经使用过的Dalvik虚拟机。后面还会有一篇文章讲解Android系统上现在使用的虚拟机:ART。 另外,我的博客里有一篇关于Java虚拟机的预习文章也可以看一看:[Java虚拟机与垃圾回收算法](/android-java-vm/) > 也许有人会问,既然Dalvik虚拟机都已经被废弃了,为什么我们还要了解它呢?出于下面的原因,让我觉得还是有必要了解一
1888 0
|
Java API 数据安全/隐私保护
【Groovy】Groovy 语言特点简介 ( 支持 Java 语法 | 支持 Java 虚拟机 | Groovy 语言是动态语言 | Groovy 扩展 JDK | 编译时元编程 )
【Groovy】Groovy 语言特点简介 ( 支持 Java 语法 | 支持 Java 虚拟机 | Groovy 语言是动态语言 | Groovy 扩展 JDK | 编译时元编程 )
301 0
|
Java Linux Android开发
【Java 虚拟机原理】Dalvik 虚拟机 ( 简介 | CPU 指令集 | Dalvik 虚拟机内存 )
【Java 虚拟机原理】Dalvik 虚拟机 ( 简介 | CPU 指令集 | Dalvik 虚拟机内存 )
166 0
【Java 虚拟机原理】Dalvik 虚拟机 ( 简介 | CPU 指令集 | Dalvik 虚拟机内存 )
|
Java 编译器 Android开发
【Java 虚拟机原理】动态字节码技术 | Dalvik & ART 虚拟机 | Android 字节码打包过程
【Java 虚拟机原理】动态字节码技术 | Dalvik & ART 虚拟机 | Android 字节码打包过程
266 0
【Java 虚拟机原理】动态字节码技术 | Dalvik & ART 虚拟机 | Android 字节码打包过程
|
存储 安全 Java
Android安全与逆向之Dalvik虚拟机架构和如何执行程序以及JIT(即时编译)
Android安全与逆向之Dalvik虚拟机架构和如何执行程序以及JIT(即时编译)
241 0
Android安全与逆向之Dalvik虚拟机架构和如何执行程序以及JIT(即时编译)
|
网络协议 Linux 虚拟化
【Linux】一步一步学Linux——虚拟机简介和系统要求(04)
【Linux】一步一步学Linux——虚拟机简介和系统要求(04) 目录文章目录 目录 VMware Workstation Pro15介绍 Workstation Pro 的主机系统要求 虚拟机网络连接支持 参考 VMware Workstation Pro15介绍VMware Workstation Pro™ 使专业技术人员能够在同一台 PC 上同时运行多个基于 x86 的 Windows、Linux 和其他操作系统,从而开发、测试、演示和部署软件。
1176 0
|
存储 Java API
Java虚拟机的简介
Java虚拟机的生命周期 一个运行时的Java虚拟机负责运行一个Java程序 。Java虚拟机的主要任务是加载class文件并且执行其中的字节码。
927 0