ArtMethod
在了解 ArtMethod 之前先了解一下这个概念:
Java 对象在内存中的布局可以看成一个结构体,父类的变量在开头,本身的变量紧随其后。
这些对象结构体在 ART 中被映射成 mirror::Object cpp 类。
有一些虚拟机比较在意的类型,例如 Class,Method 这些 Art 内部所需要的类型,他们在 mirror 中是有对应的类型的,如下图为例,
该图展示的是mirror结构体mirror::Object成员变量的内存布局也是对应映射的
Android6.0前
为啥连6.0前都要了解?因为Android这个大系统主要还是延续迭代了先前的版本,先前的版本提供给后续的Android以基础,会始终围绕着基础进行建设,有些理念也会被继承并发扬。
6.0前java层中有类ArtMethod,Method与之一一对应,Method中含有ArtMethod的引用,而mirror::ArtMethod就是java层ArtMethod的映射。
上两图证明6.0前java层中有类ArtMethod,Method与之一一对应,Method中含有ArtMethod的引用。
1 | // C++ mirror of java.lang.reflect.Method. |
6.0 之后,java ArtMethod 不复存在,被完全隐藏。但是其思路已经成为了一种被坚持的理论。即类ArtMethod,Method与之一一对应,Method中含有ArtMethod的引用,而mirror::ArtMethod就是java层ArtMethod的映射。
ArtMethod以及类似的ArtField在Linear堆区是不会被Moving GC的,因为ArtMethod/ArtField是有可能JIT/AOT在native code中的,随时变化则不好同步。
类似jmethodId与类似ArtMethod实际上是cast关系
1 | ALWAYS_INLINE |
jmethodID是Artmethod的透明引用。