文档章节

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

刘焱
 刘焱
发布于 2014/10/04 23:42
字数 840
阅读 83
收藏 0
点赞 0
评论 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

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

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

长平狐 ⋅ 2012/11/12 ⋅ 0

Java程序员从笨鸟到菜鸟之(九十八)深入java虚拟机(七)深入源码看java类加载器ClassLoader

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

长平狐 ⋅ 2012/11/12 ⋅ 0

Java和Android ClassLoder对比以及Class加载过程

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

JasmineBen ⋅ 05/23 ⋅ 0

热修复与插件化基础——Java与Android的类加载器

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

CSDN_LQR ⋅ 05/18 ⋅ 0

Java深度历险(二)——Java类的加载、链接和初始化

在上一篇文章中介绍了Java字节代码的操纵,其中提到了利用Java类加载器来加载修改过后的字节代码并在JVM上执行。本文接着上一篇的话题,讨论Java类的加载、链接和初始化。Java字节代码的表现...

tantexian ⋅ 2016/11/21 ⋅ 0

Android静态变量的生命周期

Android是用Java开发,其静态变量的生命周期遵守Java的设计。我们知道静态变量是在类被load的时候分配内存的,并且存在于方法区。当类被卸载的时候,静态变量被销毁。在PC机的客户端程序中,...

android技术开发 ⋅ 2013/07/24 ⋅ 1

剑指Offer——知识点储备-故障检测、性能调优与Java类加载机制

剑指Offer——知识点储备-故障检测、性能调优与Java类加载机制 故障检测、性能调优 用什么工具可以查出内存泄露 (1)MerroyAnalyzer:一个功能丰富的java堆转储文件分析工具,可以帮助你发现...

sunhuaqiang1 ⋅ 2016/11/07 ⋅ 0

知识总结之 插件化基础ClassLoader

安卓插件化技术已经作为一个优秀的合格研发必备要求,学习和掌握现有不同种类动态加载方案 是提升个人技术深度有效途径。 插件化基础 ClassLoader ClassLoader是什么? ClassLoader 是将jav...

CankingApp ⋅ 2017/05/05 ⋅ 0

Java 类加载机制 ClassLoader Class.forName 内存管理 垃圾回收GC

Java之类加载机制 类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行。 研究类加载机制的第二个目的是让程序能动态的控制类加载...

underA ⋅ 2013/10/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Centos7重置Mysql 8.0.1 root 密码

问题产生背景: 安装完 最新版的 mysql8.0.1后忘记了密码,向重置root密码;找了网上好多资料都不尽相同,根据自己的问题总结如下: 第一步:修改配置文件免密码登录mysql vim /etc/my.cnf 1...

豆花饭烧土豆 ⋅ 今天 ⋅ 0

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 今天 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 2

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部