Dalvik核心内容:libdvm.so  主要有C语言实现,依赖于Linux内核的一部分功能:线程机制,内存管理机制,每一个Android应有都对应一个dalvik实例

Dalvik虚拟机功能:主要完成的

对象的生命周期管理,堆栈管理,安全和异常管理,垃圾回收

Dalvik虚拟机对:线程管理,类加载,内存管理,本地接口,反射机制,解释器,即时编译等主要功能模块做优化创新。

进程管理:进程隔离、线程管理。每一个Android应用底层都会有一个独立的Dalvik虚拟机实例,所有Android应用的线程都对应一个Linux线程,进程管理依赖于Zygote机制

1。Zygote线程管理:每个Android应用都运行在一个Dalvik虚拟机实例里,每个虚拟机实例都是一个独立进程空间,目的是保护应用的独立运行和安全。

Zygote是系统启动时产生的,作用:完成虚拟机初始化,库加载,预置类库加载,初始化等操作。系统需要新的虚拟机实例时,Zygote通过复制自身。对于只读系统库,Zygote和所有虚拟机实例共享一个内存区域。

Zygote是虚拟机实例的孵化器。通过init进程启动。

启动过程:1。孵化System_Server启动系统服务,2。监听Socket等待请求命令,3。当有一个应用程序启动时,调用fork()创建新进程执行程序。

fork()三种方式:

        1.  fork(),普通进程,该进程属于Zygote进程

        2.  forkAndSpecialize(),特殊进程,该进程不再属于Zygote进程

        3.  forkSystemServer(),一个系统服务进程

     2。类加载:解析Dex文件,加载Dalvik字节码。

Android系统启动时,加载所有基础类库;用户自定义类是在虚拟机运行时载入

内存管理:分配系统启动初始化和应用运行时需要的内存资源

      1.  分配:底层依赖于dlmalloc内存分配器(DougLea编写),在堆上,分配失败回收

      2.  回收:使用的MarkSweep算法,两个阶段

        a)         Mark阶段:标出活动对象,使用栈来保存根集合,栈中每个元素使用递归追踪访问,在markBits位图中将对象的内存启始地址对应的位设为1。栈为空时,markBits就是所有可访问的对象集合

        b)         Sweep阶段:liveBites位图标识所有已经分配的对象集合。liveBits和markBits位图的差异就是所有可回收的对象集合

本地接口:Java代码中调用其它代码的接口JNI:关注代码速度,硬件控制

     3。反射机制:能动态查看、调用、更改任意类中的方法和属性,根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关语义。

         Dalvik虚拟机的核心机制之一,算作类工具

        Android Dalvik虚拟机结构及机制剖析 Dalvik虚拟机各模块机制分析

  允许程序运行时通过反射机制的API取得一个已知名称的类的内部信息,并且可以在程序运行时改变属性的相关内容或调用其内部方法

4。解释器:根据自身Dalvik ByteCode解释字节码。在mterp目录下的out目录,存储针对各个平台的解释器程序和C语言实现的通用解释器。解释器的入口代码位于interp目录下Interp.cpp中的dvmInterpret()根据不同参数执行dvmMterpStd和dvmInterpretPortable

两种实现:

          1.  C语言实现:可以移植型解释器

          2.  汇编语言实现:快速型解释器

      5。即时编译:将反复执行的热代码编译成本地代码,降低解释器压力

        程序执行的两种方式:

          1.  解释:逐句读取源程序逐句翻译机器码执行。

          2.  编译:程序执行前,整个翻译成等价的机器指令

Dalvik虚拟机结构——1的更多相关文章

  1. Dalvik虚拟机java方法执行流程和Method结构体分析

    Method结构体是啥? 在Dalvik虚拟机内部,每个Java方法都有一个对应的Method结构体,虚拟机根据此结构体获取方法的所有信息. Method结构体是怎样定义的? 此结构体在不同的andr ...

  2. Dalvik虚拟机中DexClassLookup结构解析

    http://blog.csdn.net/roland_sun/article/details/46877563 原文如下: 在Android系统中,所有的类定义以及具体的代码都是包含在DEX文件中的 ...

  3. 转 Android Dalvik虚拟机初识

    首先,让我们来思考下面几个问题: 什么是Dalvik虚拟机? Dalvik VM与JVM有什么区别? Dalvik VM有什么新的特点? Dalvik VM的架构是怎么样的? 首先,我得承认第一个问题 ...

  4. Android Dalvik虚拟机初识(转)

    原文地址:http://blog.csdn.net/andyxm/article/details/6126907 android虚拟机jvmjava优化linux内核 首先,让我们来思考下面几个问题: ...

  5. Dalvik虚拟机的运行过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8914953 在前面一篇文章中,我们分析了Dal ...

  6. Dalvik虚拟机JNI方法的注册过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8923483 在前面一文中,我们分析了Dalvi ...

  7. Dalvik虚拟机的启动过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8885792 在Android系统中,应用程序进 ...

  8. Android逆向基础----Android Dalvik虚拟机

    Android Dalvik虚拟机的特点: l  体积小,占用内存空间小. l  专有DEX可执行文件. l  常量池采用32位索引值,寻址类方法名,字段名,常量更快. l  基于寄存器架构,并拥有一 ...

  9. Android Dalvik虚拟机初识

    摘自:http://blog.csdn.net/andyxm/article/details/6126907 首先,让我们来思考下面几个问题: 什么是Dalvik虚拟机? Dalvik VM与JVM有 ...

随机推荐

  1. 学习:CC断点

    断点介绍: shark恒老师说有四种说法,但是其实都是相同的 第一个读法:普通断点 第二个读法:F2断点 第三个读法:INT3断点( int3其实就是汇编指令 ) 第四个读法:CC断点 (CC其实就是 ...

  2. Django 购物车模板

    url from django.contrib import admin from django.urls import path, re_path from django.urls import i ...

  3. java添加新表,接口合成流程必看

    生成代码后 创建模块包 先放入 实体类 然后按照 Controller 改成 然后是 service  后impl 然后是mapper  后xml 然后更新 代码

  4. Pandas | 04 Panel 面板

    面板(Panel)是3D容器的数据.面板数据一词来源于计量经济学,部分源于名称:Pandas - pan(el)-da(ta)-s. 3轴(axis)这个名称旨在给出描述涉及面板数据的操作的一些语义. ...

  5. mysql where/having

    select * from t1 where id<5;select * from t1 where id<5; where 从t1中筛选内容 而having从*中筛选内容

  6. [PHP] windows下tee指令

    在win下使用tee指令 tee为Linux指令,tee把日志输出到log的同时输出到屏幕. 在 http://sourceforge.net/projects/unxutils/?source=dl ...

  7. selenium--拖拽页面元素

    from selenium import webdriver import unittest from selenium.webdriver import ActionChains import ti ...

  8. [SDOI2018]物理实验 set,扫描线,旋转坐标系

    [SDOI2018]物理实验 set,扫描线,旋转坐标系 链接 loj 思路 先将导轨移到原点,然后旋转坐标系,参考博客. 然后分线段,每段的贡献(三角函数值)求出来,用自己喜欢的平衡树,我选set. ...

  9. Oracle_12541错误和ora-12514错误

    ORA-12541: TNS无监听程序错误 在oracle安装目录(E:\app\Administrator\product\instantclient_12_1\NETWORK\ADMIN)下查找l ...

  10. Leetcode 1254. 统计封闭岛屿的数目

    题目: 有一个二维矩阵 grid ,每个位置要么是陆地(记号为 0 )要么是水域(记号为 1 ). 我们从一块陆地出发,每次可以往上下左右 4 个方向相邻区域走,能走到的所有陆地区域,我们将其称为一座 ...