`
kerrysk
  • 浏览: 17096 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

JVM基本原理--dalvik

阅读更多

一、简介

dalvik是google在其android智能手机操作系统中用的java虚拟机。借此讲一下我对虚拟机的基本理解吧。一切编程语言要想在计算机上运行必须翻译成机器码(这是废话)。java是一种半编译半解释型语言。半编译是指:java源代码,会经过javac命令变成 .class文件。半解释是指: .class文件被jvm解释的过程。也就是因为jvm的半解释才有了java的动态语言特性:反射和annotation。

 

二、类文件预处理

在半编译阶段,java源代码被编译,在.class文件中会有类信息和虚拟机指令。dalvik有自己的libdex库负责对.class进行处理。libdex主要对.class进行处理生成自己的dex文件。主要做的工作是,对虚拟机指令进行转换(dalvik是基于寄存器的,sun虚拟机是基于栈的),对类的静态数据进行归类、压缩。

 

三、类加载

在虚拟机启动时,根据输入的参数(一般有入口类(main函数所在的类)和jar包的路径),在classath路径中加载入口类,类加载过程是:虚拟机根据入口类的全称,去遍历classpath下的dex文件(dalvik第一次加载后会生成cache文件,供下次快速加载,所以第一次会很慢),获取入口类的信息,构建入口类的Class结构体,Class结构主要包含类的field、method、(anntation 和内部类dalvik放在native处理,没在Class结构体,这样为了节省内存)。另外在加载入口类之前,可能要加载,他所依赖的类,比如父类、Class类等,类被加载后一般会在classloader中保存,下次用可以直接取到。

  • filed主要信息,filed的类型、变量名对static fiedl 还有可能有初始值(非static field在构造函数中赋初值,不保证每个类都有静态初始化块<clinit>方法,所以staitc filed初始值要单独处理)。
  • method 主要有:方法签名、method Code(虚拟机指令)、exception等信息
四、类的初始化及resolve
在一个类的metod code被虚拟机解释器执行之前,一般要进行类的初始化,类初始化主要做:static变量的赋初值(如上所说)、及method code的预处理,因为在method code内都是静态的信息,比如:你要调一个类的某个方法,指令中可能只有类名和方法名的字符串信息,而不是这个这个method结构体的指针,如果要掉的类没有初始化,你可能还要初始化这个类。以及异常错误的处理,比如你调的方法不存在,要抛NoSuchMethodError。这步叫resolve。resolve过程也可以在解释器内做,因为你有可能初始化一个类,而不调用它的方法。dalvik是在第一次调一个方法时resolve的。

五、类的解释执行
在加载完入口类时,虚拟机会调用JNI(对虚拟机对外暴露的函数的封装,可以让java和C互相调用)的方法去执行,入口类的main方法,解释器首先获取此类的method结构体,获得method code一条一条解释执行。
常见的指令:
  • const、const-string等:一般是把一个常量(int double short boolean char string ……),放入一个寄存器。
  • add sub div xor or and ……:加减乘除、与或非等
  • getfield putfield 、getstatic putstaic:在堆上获取相应对象的field值,对static可能在Class结构体内存放
  • invokeXXX:调用某个方法,要在栈上保存当前frame信息(包括IP 及各寄存器值),push一个frame去解释另一个方法。方法调用是,要将这个方法的参数copy到新的frame 寄存器上。在被调用的方法结束时,在栈上pop出该frame,把方法返回值copy到调用frame的寄存器上。(这个可以有多种实现,dalvik是把返回值copy到全局的ret变量中,在用move_result指令来做到这一点)
  • return :告诉解释器方法调用结束
  • if if_eqz等:逻辑判断、还有swith case等也有专门指令
  • new指令,new一个对象放在堆上
六、异常处理
首先明确一个概念,就是一个java的线程在dalvik内对应一个C线程,每个java线程都会有自己的执行栈。Exception的处理时,当解释器遇到Excepiton时,把这个异常对象放入Thread结构体保存,在解释某些有可能抛异常的指令时,去check,check到,就结束执行下一条指令,往下找catch,如果没有就一直往上抛,只到栈上没frame,虚拟机结束。

七、堆结构及GC
堆是虚拟机为了预存对象,而事先分配的一块大内存。对象在堆上一般要保存,其Class信息(属于某个class)和对象每个field的值。GC时,虚拟机遍历所有线程栈及全局变量(JNI全局reference、Stringpool等),对有引用对象进行mark,然后遍历堆进行swap。另外还牵扯finalize的执行及java reference机制等。
堆设计最大的麻烦在于,频繁的分配和释放对象可能导致内存碎片。一般做法是在GC后要进行一次堆整理,但对整理会改变对象的指针地址,可能导致其他对象引用一个无效的指针,所以一般要另外为每个对象对应一个定长的map,在引用对象上保存一个不变的映射值,在根据这个值找到对象。堆整理时,改变引用值。这种做法的坏处是浪费了内存,对JNI的getArrayElements方法不得不采用copy模式等。另一种做法是不进行堆整理,这样要用好的算法控制不至于产生过多的内存碎片。



 

分享到:
评论

相关推荐

    dalvik-bytecode-4.0.4 文档

    与传统的Java虚拟机(JVM)不同,Dalvik字节码采用.dex格式,优化了内存占用和加载速度,更适合移动设备的资源限制。 二、Dalvik字节码结构 Dalvik字节码是一种简化的、紧凑的指令集,每条指令通常占16位,由一个8...

    新版Android开发教程&笔记四--Dalvik ADB

    ### 新版Android开发教程&笔记四--Dalvik ADB ...通过深入了解Dalvik虚拟机的工作原理及Android开发中常用的Java包功能,开发者能够更好地掌握Android应用程序的开发流程和技术细节,从而创建出高质量的应用程序。

    深入理解Android之dalvik

    与传统的Java虚拟机(如JVM)不同,Dalvik使用.dex(Dalvik Executable)格式的字节码,这种格式更适合移动设备的存储和内存限制。 2. **.dex文件格式**: .dex文件是一种专门为Dalvik设计的优化的字节码格式,它...

    Android Framework介绍 Dalvik原理 JIT介绍

    本文详细介绍了Android Framework的基本概念、Dalvik虚拟机的工作原理以及JIT编译器的作用。了解这些基础知识对于深入理解和开发Android应用程序至关重要。未来随着技术的发展,Android系统可能会继续进化,但其核心...

    深入理解JVM内存结构及运行原理全套视频加资料.txt

    2019最新深入理解JVM内存结构及运行原理(JVM调优)高级核心课程视频教程下载。JVM是Java知识体系中的重要部分,对JVM底层的了解是每一位Java程序员深入Java技术领域的重要因素。本课程试图通过简单易懂的方式,系统...

    JVM基础教程

    ### JVM基础教程知识点详解 #### 一、Java虚拟机(JVM)概述 - **定义**:Java虚拟机...通过上述内容的学习,我们可以深入了解Java虚拟机的工作原理及其核心组成部分,这对于开发高效、稳定的Java应用程序至关重要。

    Dalvik指令格式索引表及位描述索引表

    `dalvik-bytecode.html`可能包含对Dalvik字节码的基本介绍、指令集概述以及实例解析。而`instruction-formats.html`则可能深入到指令的位布局和语法细节,提供一个完整的Dalvik指令格式索引。 通过深入学习这两个...

    “Dalvik VM的字节码”,“Dalvik VM指令格式”

    `dalvik-bytecode.html`和`instruction-formats.html`文件可能提供了关于Dalvik字节码指令的详细说明和格式。这些文件通常会列出每个指令的操作码、参数格式、参数数量以及它们的用途。开发者可以使用这些信息来反...

    Dalvik_VM_Internals.rar_Dalvik pdf_android_dalvik vm_dalvik vm i

    除了基本的虚拟机功能,Dalvik VM还包含了类装载、异常处理、线程调度等功能。类装载机制使得应用程序可以在运行时动态加载和卸载类,异常处理则提供了类似于Java的try-catch-finally结构,线程调度则保证了多任务的...

    JVM 入门到精通 Typora 版

    ### JVM入门到精通知识点梳理 ...理解JVM的工作原理对于优化Java应用程序的性能至关重要。通过对JVM的基础知识、结构、架构模型和生命周期的深入了解,可以帮助开发者更好地编写高效稳定的Java程序。

    深入理解Java虚拟机视频教程(jvm性能调优+内存模型+虚拟机原理)视频教程

    第18节Java虚拟机-dalvik00:02:20分钟 | 第19节Java虚拟机-MicrosoftJVM00:03:57分钟 | 第20节Java虚拟机-高性能Java虚拟机00:02:58分钟 | 第21节Java虚拟机-TaobaoVM00:03:06分钟 | 第22节Java内存区域-简介00:...

    Android编程之虚拟机Dalvik教程[PDF].rar

    Dalvik虚拟机的工作原理主要包括以下几个关键点: 1. **字节码转换**:Java源代码编译成.class文件后,通过DX工具转换为Dalvik的.dex字节码。.dex文件包含了类信息、常量池、方法和字段定义等,适合Dalvik执行。 2...

    深入理解Android之dalvik.pdf

    学习方法则强调了理论与实践相结合的重要性,即首先理解虚拟机的基本原理,再通过代码实现来加深理解。至于学习的终点,则是能够掌握从Java程序到字节码再到被虚拟机加载执行的过程。 #### 三、Dalvik虚拟机简介 ...

    Android Dalvik源码

    在深入理解Android Dalvik源码之前,我们首先需要了解一些基本概念。 1. **Dalvik虚拟机**:Dalvik是Google为Android设计的一个专有虚拟机,其设计目标是在移动设备上高效地运行Java应用程序。与标准的Java虚拟机...

    dalvik.zip

    综上所述,【dalvik.zip】这个压缩包提供的Dalvik源码可以帮助开发者理解Android系统的底层运行机制,了解Dalvik虚拟机的工作原理,对于进行性能优化、安全分析以及系统开发具有极高的价值。通过深入学习这些知识点...

    JVM DVM的区别

    JVM(Java Virtual Machine)与DVM(Dalvik Virtual Machine)作为两种不同的虚拟机技术,在移动应用开发领域扮演着重要角色。本文旨在深入探讨这两者之间的主要区别,帮助开发者更好地理解它们的工作原理和技术特点...

    深入理解JVM1

    Google的Dalvik VM也是JVM的一种实现,但它基于寄存器而非栈,且Dalvik字节码不同于标准Java字节码。 Java字节码是JVM执行的中间语言,它位于源代码和机器代码之间,确保了WORA特性。字节码的执行顺序由JVM的解释器...

    Android Dalvik虚拟机结构及机制剖析第2卷

    Dalvik并非传统的Java虚拟机(JVM),而是针对移动设备进行了优化,采用.dex格式的字节码,这种格式更小、更适合内存有限的移动设备。Android应用的源代码编译成Dalvik字节码后,通过Dalvik虚拟机进行解释执行或预先...

    dalvik分析

    在Android操作系统中,Dalvik是一个关键组件,它是一个专为移动设备设计的Java虚拟机(JVM)。这个名字源于科罗拉多州的一个小镇,是Google为Android系统选择的名字。本篇文章将深入探讨Dalvik的工作原理、特点以及...

    浅析dalvik虚拟机JIT技术的实现.doc

    本文旨在深入探讨Dalvik虚拟机中JIT技术的实现原理,以及其在Android平台上的应用。 #### Dalvik虚拟机与JIT技术概述 Dalvik虚拟机是专为Android设计的虚拟机,不同于传统的Java虚拟机(JVM),它采用寄存器架构而...

Global site tag (gtag.js) - Google Analytics