Android Art 虚拟机 GC 机制之 java 部落的崛起

本文介绍了Android Art虚拟机的GC机制,强调了理解Linux内存管理的重要性。文章从Java对象的创建入手,探讨了Android应用程序内存分配与释放的背景,解释了为何需要GC。文章还简要介绍了Java虚拟机,尤其是Android系统中的dalvik和art虚拟机。通过类比故事,阐述了Java虚拟机如何在Android系统中运行和管理Java程序的内存,以及zygote进程在其中的作用。
摘要由CSDN通过智能技术生成

前言

  在正式研究 android art 虚拟机的GC机制之前,必须要先了解 linux 的内存管理,是的,只需要了解,不必深入,毕竟 android 系统是基于 linux 系统开发出来的移动操作系统,而GC机制当然也是基于 linux 系统的内存管理开发出来的用户态内存回收进制。除此之后,还要有一定的 linux 系统进程管理的基础,在深入探究之前可自行先复习一下 linux 系统的进程管理和内存管理,加固基础知识,在后期的研究会有事半功倍的效果,否则会不知所云,导致越到后面越没兴趣,最后放弃 android art 虚拟机的GC机制的学习。
  现在行业内也有不少相关的文章是分析 android art 虚拟机的内存回收机制的,有些也写得不错,比如老罗的ART运行时一系列的文章,结合源码分析其原理,不过从头看一次下来,能记住并且搞懂的内容还是比较少的。本文是只针对整个GC机制从浅到深系统地整理一次,包括GC机制所涉及到的虚拟机相关知识,对比 linux 系统的进行系统整理,使得读者更好理解。
  本文只做知识分享,给广大的想要深入理解 GC 机制的开发者提供前车之鉴,带大伙入个门,少走弯路,最后也感谢老罗的分享,在细节上分析得很好。
  给读者的个人建议:最好是在深入 art 虚拟机的源码之前先阅读完本篇文章,对他有个大概的理论了解,否则会非常痛苦。

介绍

  Android GC 的全称是 Android Gabage Collection,顾名思义是安卓系统的垃圾收集,为什么会有垃圾收集?众所周知,Android 应用程序大部分都是基于 java 语言开发的,在编写应用程序时不需要对对象进行内存释放的操作,通常在 new 一个对象后,当不需要使用时只需要把该对象的引用重新赋值为 Null 就可以了。这时 GC 就有存在的价值了,该对象的真正内存释放是在 GC 过程中释放掉了,不需要应用程序开发者操心。这就是 java 语言的核心之一,让开发者有更多的精力去关注应用逻辑,而并不需要与 C/C++ 那样考虑因内存没有释放导致内存泄漏的问题。
  但是当把对象的引用重新赋值为 Null 时,并不会立即触发 GC 释放该对象的内存,那么,是什么时候把对象释放掉的呢?这个问题会等阅读完整篇文章后,你自然就有答案了。请跟随我的脚步耐心阅读下去。

1、java 对象的创建

  要想清楚知道GC是如何工作的,则必须先知道对象是如何创建的?java 对象在 linux 系统中是以什么形状存在的?
  首先,请读者先以了解到的 linux 系统知识想像,或者猜测一下 Android 系统是如何在 new 一个对象时,为该对象分配内存的?如果你猜到最终是通过 malloc 函数分配一块内存的话,说明你的 linux 系统知识很扎实; 如果你猜到最终是通过 mmap 函数分配内存的话,说明你是 linux 高手。我们先不讨论哪种是正确的,我们先回顾一下 linux 应用程序的内存分布,毕竟 Android 应用程序也是跑在 linux 系统之上的,Android 应用程序的内存分布同样有 linux 应用程序的特性。如下图所示,是从教科书上截下来的。
  这里写图片描述
  Android 应用程序在启动运行之后,其4G的内存分布空间与 linux 应用程序基本一样,有代码段、数据段、和堆栈区域。与 linux 应用程序的唯一区别是,Android 应用程序是运行在 java 虚拟机之上的,如果你把 Android 应用程序与 java 虚拟机看作整体,其本质就是一个 linux 应用程序。好了,在这里开始多出了一个 java 虚拟机。下面先介绍一下 java 虚拟机。

1.1、java 虚拟机

  目前 Android 系统中的 java 虚拟机有两个,一个是dalvik,另一个是 art,在 Android 4.4 之后的版本都是使用 art 作为 java 虚拟机。从网络上搜索 java 虚拟机,就会有大量的介绍,这里为了加深印象,我自己总结了下什么是 java 虚拟机,它

### 回答1: Android Java虚拟机ART是一种全新的虚拟机,它是Android Lollipop操作系统中默认的运行时环境,相比于旧版的Dalvik虚拟机,它能够提供更好的性能和体验。 ART的最大特点是在使用前将字节码转换为机器码,这样可以在运行时减少解释和编译的时间,从而提高应用程序的响应速度。此外,在ART中也引入了一些新的技术,例如预编译、AOT和热编译等,这些都能够优化应用程序的启动速度和运行效率。 在深入研究ART之前,必须先了解Java虚拟机(JVM)的基本概念和原理。JVM是一种运行Java程序的虚拟机,将Java源代码转换为字节码,再由虚拟机解释执行。同样地,ART也采用相同的原理来实现应用程序的运行,只不过它将字节码转换为机器码,从而提高了运行速度和效率。 因此,熟悉Java虚拟机ART的工作原理,能够帮助开发者更好地理解和优化应用程序的性能。此外,对于一些需要高效运行的应用场景(例如游戏、图像处理等),ART也能够提供更好的运行环境,提高应用程序的稳定性和响应能力。 总之,深入理解Android Java虚拟机ART对于开发者来说非常重要,尤其是在需要优化应用程序性能和响应速度的情况下。只有深入了解ART的原理和特点,才能更好地应用它来提高应用程序的运行效率。 ### 回答2: Android Java虚拟机ARTAndroid系统中最新的运行时环境。相较于旧有的Dalvik虚拟机ART采用预编译技术,将应用程序字节码一次性编译为本地机器码,提高了应用程序的运行效率和响应速度,同时也降低了资源消耗。因此,深入理解Android Java虚拟机ART对于Android开发者来说是非常必要的。 深入学习ART,我们需要了解其内部运作机制,包括Dex编译、ClassLoader、Garbage Collection等关键概念。ART采用了AOT和JIT两种编译方式,也采用了一些新的优化方法,如Profile Guided Optimization(PGO)、Image Space Estimation等,以提高应用程序的可执行性和启动时间。 ART的ClassLoader实现了一种高效的动态加载技术,它使得应用程序可以在运行时动态更新代码库、插件包等,从而大大扩展了应用程序的功能和灵活性。同时ART的ClassLoader也是构建Android虚拟化环境的基础,它可以从不同的应用程序中加载开放的类,并为每个应用程序提供一个独立的执行环境。 最后,ART的Garbage Collection机制实现了一种全新的分代收集算法,将耗费大量时间的垃圾回收操作分散到不同的虚拟机堆内,从而大幅度提高了应用程序的性能和响应速度。 总之,深入理解Android Java虚拟机ART对于Android开发者来说十分关键,它将为我们提供更为深入的开发思路和方法,使我们的应用程序更加高效,同时也为我们的Android应用程序开发添上浓墨重彩的一笔。 ### 回答3: Android Java虚拟机ART (Android Runtime)是安卓4.4系统及以上版本中的默认虚拟机。相比原先的Dalvik虚拟机ART可实现更高的性能和更好的系统稳定性。 ART的核心思想是AOT( Ahead of Time)编译。它在应用程序安装的时候就将应用程序代码转换成本地机器指令并编译成机器代码,以C/C++库的形式保存在设备上。相比Dalvik,在应用程序的执行过程中省去了JIT编译的时间和运算,能够提高应用程序的运行速度。 除此之外,ART还有几个重要的特点: 1. 超低功耗:ART的AOT编译技术使得应用执行时可以直接使用本地机器指令,减少了CPU的时间浪费,使得应用程序的功耗更低。 2. 内存占用减少: ART允许应用程序在运行时进行类加载,实现更高效的内存管理。相比Dalvik虚拟机ART在处理内存和垃圾回收时能够更好地利用系统资源,减少了应用程序所占用的内存。 3. 支持快速应用开发:通过使用ART虚拟机可以通过模块形式快速开发出具有更好体验的应用程序。 总之,深入理解Android Java虚拟机ART需要着重理解ART AOT编译原理、内存管理机制、以及对快速应用开发的支持。这些特点的综合优势使得安卓应用程序能够实现更快的运行速度、更低的功耗、更快的开发效率和更好的用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值