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日

目录
相关文章
|
7月前
|
存储 缓存 算法
Very Heavy ! Java虚拟机的垃圾回收处理与垃圾收集算法
Very Heavy ! Java虚拟机的垃圾回收处理与垃圾收集算法
54 0
|
6月前
|
监控 算法 Java
深入理解Java虚拟机:垃圾收集机制的奥秘
【6月更文挑战第17天】在Java的世界,垃圾收集(GC)是保持内存健康不可或缺的一环。本文将揭开JVM垃圾收集的神秘面纱,探索其原理、算法及调优策略,帮助开发者更好地理解和掌握这一关键技术,确保Java应用的性能与稳定性。
43 5
|
5月前
|
监控 算法 Java
Java虚拟机垃圾收集机制深度解析
在Java的世界中,垃圾收集是确保内存管理高效运行的关键机制之一。本文将深入探讨Java虚拟机的垃圾收集机制,包括其工作原理、常见的垃圾收集算法以及调优实践。我们将基于最新的研究数据和实验结果,提供对垃圾收集器性能的比较分析,并讨论如何根据不同应用场景进行优化。通过逻辑严密的分析,我们旨在为Java开发者提供实用的指导,以帮助他们更好地理解和掌握这一关键技术。
|
7月前
|
Java 虚拟化 Docker
Docker简介及用途,为什么要使用Docker?Docker容器和虚拟机的区别
Docker简介及用途,为什么要使用Docker?Docker容器和虚拟机的区别
|
存储 算法 安全
《深入理解Java虚拟机》读书笔记(五)--垃圾收集算法概述
《深入理解Java虚拟机》读书笔记(五)--垃圾收集算法概述
57 0
|
算法 云计算 虚拟化
硬件加速器IAA的最佳实践解读和libvirt虚拟机热迁移流程简介| 第80-81期
本周二,了解 IAA 加速器的原理及其应用&云上最佳实践;libvirt 虚拟机热迁移整体流程等。
|
存储 算法 Java
虚拟机中的经典垃圾收集器及常用参数解析(Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1)
这里说的经典垃圾收集器,并不是说这些垃圾收集器多么的优秀,因为随着JDK版本的不断更新,新的垃圾收集器越来越多,这些在JDK9及之前使用的垃圾收集器自然就成为了相对经典的版本。说到垃圾收集器,就必须说垃圾收集算法 点击查看垃圾收集算法详解 ,因为垃圾收集算法是收集收集器的方法论,正是因为有了垃圾收集算法,才有了各种各样的垃圾收集器,下面认识下这些经典的垃圾收集器吧。
867 0
虚拟机中的经典垃圾收集器及常用参数解析(Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1)
|
算法 Java
JVM 虚拟机4种垃圾收集算法
垃圾收集算法可以划分为“引用计数式垃圾收集”(Reference Counting GC)和“追踪式垃圾收集”(Tracing GC)两大类,这两类也常被称作“直接垃圾收集”和“间接垃圾收集”。
116 0
|
存储 算法 Java
Java虚拟机-垃圾回收简介
Java虚拟机-垃圾回收简介
116 0
Java虚拟机-垃圾回收简介
|
存储 XML Java
JVM虚拟机-Class文件简介
JVM虚拟机-Class文件简介
141 0
JVM虚拟机-Class文件简介