Android(java)学习笔记102:Dalivk虚拟机的初始化过程
1. 初始化下面系统函数(调用dvmStartup函数初始化所有相关的函数)
开始学习虚拟机的初始化过程,先从dvmStartup函数开始,这个函数实现所有开始虚拟机的准备工作:
dvmAllocTrackerStartup函数初始化跟踪显示系统,跟踪系统主要用生成调试系统的数据包。
dvmGcStartup函数是用来初始化垃圾回收器。
dvmThreadStartup函数是初始化线程列表和主线程环境参数。
dvmInlineNativeStartup函数是分配内部操作方法的表格内存。
dvmVerificationStartup函数是初始化虚拟机的指令码相关的内容,以便检查指令是否正确。
dvmRegisterMapStartup函数是分配指令寄存器状态的内存。
dvmInstanceofStartup函数是分配虚拟机使用的缓存。
dvmClassStartup函数是初始化虚拟机最基本用的JAVA库。
dvmThreadObjStartup函数是初始化虚拟机进一步使用的JAVA类库线程类。
dvmExceptionStartup函数是初始化虚拟机使用的异常JAVA类库。
dvmStringInternStartup函数是初始化虚拟机解释器使用的字符串哈希表。
dvmNativeStartup函数是初始化本地方法库的表。
dvmInternalNativeStartup函数是初始化内部本地方法,建立哈希表,方便快速查找到。
dvmJniStartup函数是初始化JNI调用表,以便快速找到本地方法调用的入口。
dvmReflectStartup函数是缓存JAVA类库里的反射类。
2. 上面初始化函数处理之后,接着把下面这些类先进行初始化,如下:
staticconst char*earlyClasses[] = {
"Ljava/lang/InternalError;",
"Ljava/lang/StackOverflowError;",
"Ljava/lang/UnsatisfiedLinkError;",
"Ljava/lang/NoClassDefFoundError;",
NULL
};
初始化这些类,就是调用函数dvmFindSystemClassNoInit来初始化。
3. 接着调用dvmValidateBoxClasses函数来初始化JAVA基本类型库,如下:
staticconstchar*classes[] = {
"Ljava/lang/Boolean;",
"Ljava/lang/Character;",
"Ljava/lang/Float;",
"Ljava/lang/Double;",
"Ljava/lang/Byte;",
"Ljava/lang/Short;",
"Ljava/lang/Integer;",
"Ljava/lang/Long;",
NULL
};
备注:这些类调用函数(刚刚使用的dvmFindSystemClassNoInit、dvmValidateBoxClasses等),不是上面使用系统函数来初始化,而是调用dvmFindClassNoInit来初始化。
4. 调用dvmPrepMainForJni类调用函数准备主线程里的解释栈可以调用JNI的方法;
调用registerSystemNatives类调用函数来注册JAVA库里的JNI方法;
调用dvmCreateStockExceptions类调用函数分配异常出错的内存;
调用dvmPrepMainThread类调用函数完成解释器主线程的初始化;
调用dvmDebuggerStartup类调用函数进行调试器的初始化;
最后调用dvmInitZygote类调用函数或者dvmInitAfterZygote类调用函数来初始化线程的模式,调用dvmCheckException函数检查是否有异常情况出现。
5. 到这里就把整个虚拟机初始化流程完成。
最新文章
- Java基础Collection集合
- 【spoj705】 Distinct Substrings
- NOIP2015 Revenge
- ACM/ICPC 之 递归(POJ2663-完全覆盖+POJ1057(百练2775)-旧式文件结构图)
- Java_Spring MVC_Servlet
- 修改CMD命令窗口编码并保存方法
- 文字排版--字体(font-family)
- eclipse,tomcat部署web项目,以及本地文件访问
- testng增加失败重跑机制
- cowboy源码分析(二)
- IDEA中添加javap反编译
- centos7下mysql半同步复制原理安装测试详解
- 小甲鱼Python视频课后答案(第一讲)---仅记录学习
- oracle闪回、闪回数据归档Flashback Data Archive (Oracle Total Recall)的真正强大之处、11gR2增强以及合理使用
- sql server 清理缓存
- 初识vuex vuex 的基本用法
- windows : Jmeter自动化测试-eclipse+maven+jmeter
- 控件无法安装的问题-Unable to execute file
- OSLab课堂作业2
- [Python] 模拟登录网站(。。为了之后操作数据。。)
热门文章
- Openstack swift 学习笔记
- loj #2325. 「清华集训 2017」小Y和恐怖的奴隶主
- 关于在SSM框架下使用PageHelper
- centos 基础设置
- CentOS 6.6 x64安装TensorFlow
- 实现网上大神的asp.net mvc + ef +easyui
- 解决eclipse双击类名、选中类名出现假死或者非常慢的问题(取消Eclipse鼠标悬停和自定义快捷键)
- DozerBeanMapper 配置
- Java集合——集合框架Iterator接口
- Default Bearer, Dedicated Bearer... What exactly is bearer ?