• Dalvik虚拟机结构——1


    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.  编译:程序执行前,整个翻译成等价的机器指令

     

  • 相关阅读:
    Nginx配置中运行与启动的详细介绍
    php实现文件上传进度条
    C# 提取逗号分割的字符串
    【sas proc sql】out join
    【SAS NOTE】substr函数
    【sas proc sql】子查询
    【SAS NOTE】数字字符互换
    【SAS NOTE】数组
    【sas Notel】merge
    【sas sql proc】inner join or outer join
  • 原文地址:https://www.cnblogs.com/heixiang/p/10976159.html
Copyright © 2020-2023  润新知