ART 虚拟机| 青训营笔记

94 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第10天

ART 虚拟机

image.png

黄色的部分就是ART,给APP和system server进程提供运行环境。

image.png ART可以粗略的划分成两个层级,执行层和runtime层,执行层负责直接面向java代码的产物,来翻译或者编译执行。runtime层则是提供java语法特性和其他一些支撑运行的底层机制。
GC
GC,是指垃圾回收 (Garbage Collection),是一些语言管理内存的方式,如 Java 语言等;程序员不需要主动管理内存,程序运行时环境(虚拟机)会做垃圾回收的工作,就是在合适的时机 自动释放不再需要的内存。

与 GC 对应的是 native 语言,它需要程序员主动释放申请内存,忘记释放或者释放时机不合适都会产生问题。

GC Root
在 native 语言中,内存的申请和释放需要程序员来操作,做到正确地申请和释放内存就是程序员要考虑的问题。

在类似 Java 这种使用了 GC 的语言中,程序员不关心内存的释放。正确地释放内存就是 GC 的责任,GC 的原则是保证正确性的前提下,尽可能提升性能。 于是就使用了 GC Root 的机制,逻辑上就是:GC 认为 GC Root 以及它引用的对象是程序后面的可能会用到的,所以不会释放;没有被 GC Root 直接或间接引用的对象,后面一定不会被用到,可以被释放掉。

在 Java 中常被用于GC Root的类型如下:

  • (函数未出栈时的)局部变量
  • 静态变量
  • 存活状态的线程
  • Native 方法中 JNI 引用的对象

静态字段的存储位置

一个类所具有的信息可以分为两部分,一部分是元数据,例如该类有多少个实例字段,多少个虚拟方法等,是描述性的信息。另一部分则是静态字段的值。元数据可以通过art::mirror::Class对象来表示,而静态字段将紧随其后。

这种内存结构和Java对象十分相似,上半部分是元数据,下半部分是字段值。只不过对象的元数据是klass_monitor_,而类的元数据是class_loader_methods_等。对象中的字段值是实例字段,类的字段值是静态字段。


参考链接:juejin.cn/post/695092… 【Android 客户端专场 学习资料三】第四届字节跳动青训营 - 掘金 (juejin.cn) 来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。