文档章节

DVM初始化——FindClass,加载系统类(一)

仰简
 仰简
发布于 2014/10/04 23:42
字数 840
阅读 85
收藏 0

        从Dalvik findClass方面看,又可把Java类分为System Class与非System Class。System Class一般指的是Java的类库和Andrioid的核心类。而它们的区别在于,System Class是由虚拟机初始化时候加载的。而因为Android的Kernel是基于Linux Kernel,Android在创建一个新的进程时,设计了Zygote这个特殊的进程来fork新的进程,因为fork的写时复制特性,而每一次都是基于Zygote这个进程来fork的,因此,每一个新的进程诞生不仅拥有了一个自己的dalvik,而且这个dalvik基本上是一个只是加载了system class的dalvik。而后,随着程序的运行,每个虚拟才有了彼此的不同,加载着各个进程的class及其他资源。

        Android的Zygote进程的bin档就是system\bin\app_process,在app_process进程的main()函数中,随着startVM()的调用,就标示着Dalvik的启动。在startVM()中,通过property_get()调用,初始化Dalvik的基本配置信息,如初始堆,最大可用堆的大小,是否支持JIT,选择什么模式的解释器等。例如以下代码就是对解释器的选择。

property_get("dalvik.vm.execution-mode", propBuf, "");
    if (strcmp(propBuf, "int:portable") == 0) {
        executionMode = kEMIntPortable;
    } else if (strcmp(propBuf, "int:fast") == 0) {
        executionMode = kEMIntFast;
#if defined(WITH_JIT)
    } else if (strcmp(propBuf, "int:jit") == 0) {
        executionMode = kEMJitCompiler;
#endif
    }

        设置好了基本的配置属性后,就会利用这些属性,通过JNI_CreateJavaVM()的调用创建虚拟机,为什么CreateJavaVM前面要加个JNI_前缘呢,好像挺奇怪的,它并不是jni函数啊。而然后经过dvmStartup()的调用,会初始化GC内存管理及一部分系统类。初始化这部分系统类,调用的是dvmClassStartup()。那么,这部分系统类是什么呢,为什么要单独放出来呢?

        在dvmClassStartup()中,第一步并不是急着去加载类,而是初始化一个HashMap表,用以保存所有被该虚拟机所加载的类。HashMap创建好之后就会被保存在gDVM中。gDVM是一个全局变量,它的类型是DvmGlobals,这是个C++ struct类型,成员变量相当的多,其中不仅保存着已加载的类,还保存着Dalvik实例。

struct DvmGlobals gDvm;

gDvm.loadedClasses =
        dvmHashTableCreate(256, (HashFreeFunc) dvmFreeClassInnards);

        接下来,就是调用createInitialClasses()来加载这部分系统类了。

  /*
     * Create the initial classes. These are the first objects constructed
     * within the nascent VM.
     */
    if (!createInitialClasses()) {
        return false;
    }

从代码的实现来看,这里分为两部分工作,第一部分为加载Java中最为神秘的类Class,第二部分就是加载了用于构造Java这门语言的基础类型,有了它,才能定义我们所说的类。

/*
 * Create the initial class instances. These consist of the class
 * Class and all of the classes representing primitive types.
 */
static bool createInitialClasses() {
    /*
     * Initialize the class Class. This has to be done specially, particularly
     * because it is an instance of itself.
     */
   
     // 初始化Class
    
    ClassObject* clazz = (ClassObject*)
        dvmMalloc(classObjectSize(CLASS_SFIELD_SLOTS), ALLOC_NON_MOVING);
    if (clazz == NULL) {
        return false;
    }
    DVM_OBJECT_INIT(clazz, clazz);
    SET_CLASS_FLAG(clazz, ACC_PUBLIC | ACC_FINAL | CLASS_ISCLASS);
    clazz->descriptor = "Ljava/lang/Class;";
    gDvm.classJavaLangClass = clazz;
    LOGVV("Constructed the class Class.");

    /*
     * Initialize the classes representing primitive types. These are
     * instances of the class Class, but other than that they're fairly
     * different from regular classes.
     */
    // 初始化基本类型
    bool ok = true;
    ok &= createPrimitiveType(PRIM_VOID,    &gDvm.typeVoid);
    ok &= createPrimitiveType(PRIM_BOOLEAN, &gDvm.typeBoolean);
    ok &= createPrimitiveType(PRIM_BYTE,    &gDvm.typeByte);
    ok &= createPrimitiveType(PRIM_SHORT,   &gDvm.typeShort);
    ok &= createPrimitiveType(PRIM_CHAR,    &gDvm.typeChar);
    ok &= createPrimitiveType(PRIM_INT,     &gDvm.typeInt);
    ok &= createPrimitiveType(PRIM_LONG,    &gDvm.typeLong);
    ok &= createPrimitiveType(PRIM_FLOAT,   &gDvm.typeFloat);
    ok &= createPrimitiveType(PRIM_DOUBLE,  &gDvm.typeDouble);

    return ok;
}







© 著作权归作者所有

共有 人打赏支持
仰简
粉丝 1
博文 14
码字总数 14547
作品 0
广州
高级程序员
DVM 初始化 —— 关于Java类的基础知识

DVM,也就是Dalvik,Android4.4之后,还推出了ART,但没有作为默认虚拟机使用,直到5.0才正式作为默认虚拟机使用。可见,一个好的东西是需要经历一些磨难才能出的来的。 我把Java中的类分成两...

刘焱
2014/09/27
0
0
热修复与插件化基础——Java与Android的类加载器

一、java中的ClassLoader 1、类加载器 2、加载流程 Loading:类的信息从文件中获取并载入到JVM的内存中。 Verifying:检查读入的结构是否符合JVM规范的描述。 Preparing:分配一人上结构用来...

CSDN_LQR
05/18
0
0
Java程序员从笨鸟到菜鸟之(九十九)深入java虚拟机(八)开发自己的类加载器

欢迎阅读本专题的其他博客: 深入java虚拟机(一)——java虚拟机底层结构详解 深入java虚拟机(二)——类的生命周期(上)类的加载和连接 深入java虚拟机(三)——类的生命周期(下)类的初...

长平狐
2012/11/12
91
0
Java程序员从笨鸟到菜鸟之(九十八)深入java虚拟机(七)深入源码看java类加载器ClassLoader

欢迎阅读本专题的其他博客: 深入java虚拟机(一)——java虚拟机底层结构详解 深入java虚拟机(二)——类的生命周期(上)类的加载和连接 深入java虚拟机(三)——类的生命周期(下)类的初...

长平狐
2012/11/12
137
0
Java和Android ClassLoder对比以及Class加载过程

Java的ClassLoder的父子关系如下:Bootstrap--ExtClassClassLoader---AppClassLoader。 JVM启动时先运行启动类加载器Bottstrap,主要加载Java核心API;然后加载扩展类加载器ExtClassLoder,该...

JasmineBen
05/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Asus RamPage VI Extreme开不了机

Asus RamPage VI Extreme 的机器突然关机,然后就再也开不了机,没有任何反应。有人说是BIOS问题,可是这个连Bios都进不去的,按后面的刷新Bios、清除CMOS等都没有什么效果,没有任何反应。 ...

openthings
37分钟前
1
0
ubuntu 18.04 desktop 截图快捷键

如图,点击下方的 add shortcut 为这个快捷键命名 输入截图 command gnome-screenshot -a 设置快捷键 常用为 Ctrl - Alt + a 参考 http://os.51cto.com/art/200903/113091_all.htm...

公孙衍
46分钟前
0
0
一个六年Java程序员的从业总结:比起掉发,我更怕掉队

恍然间,发现自己在这个行业里已经摸爬滚打了五、六年了,原以为自己就凭已有的项目经验和工作经历怎么着也应该算得上是一个业内比较资历的人士了,但是今年在换工作的过程中却遭到了重大的挫...

老道士
48分钟前
18
2
Spacemacs快捷键

由于Spacemacs快捷键太多,为方便使用,将常用的快捷键记录在此。 以下快捷键都是在emacs的evil模式下 Buffers操作 创建名称为<buffer-name>的buffer SPC b b <buffer-name> 从已打开的buf...

yxmsw2007
53分钟前
1
0
GO冒泡,二分查找

package mainimport("fmt")func main() {var arr [5]int = [5]int{11,13,9,2,25}maopao(&arr)fmt.Println("arr = ", arr) //[2 9 11 13 25]findIndex := binaryFind(&arr, 0......

汤汤圆圆
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部