420 likes | 678 Views
Android Virtual Machine. Java 基本分类 Java 虚拟机简介 Dalvik 虚拟机简介. Java 基本分类. J2ME/J2EE/J2SE 的比较 J2SE TM (The Java TM 2 Platform, Standard Edition) 标准 java 程序库,主要面向桌面开发的,提供 GUI 支持, applet 等通常的 java 应用 .
E N D
Java 基本分类 • Java 虚拟机简介 • Dalvik虚拟机简介
Java 基本分类 • J2ME/J2EE/J2SE的比较 • J2SETM (The JavaTM2 Platform, Standard Edition) 标准java程序库,主要面向桌面开发的,提供GUI支持, applet等通常的java应用. • J2EETM (The JavaTM2 Platform, Enterprise Edition) 主要为企业网解决方案的服务器端开发而设计,提供数据库访问,消息,跨进程通信及事物处理等等功能。 • J2METM (The JavaTM2 Platform, Micro Edition) 主要针对移动平台
Java 基本分类 • J2ME体系结构 Profile (MIDP Application) CLDC/CDC Libraries KVM(K virtual Machine) Operating System (Windows, Linux)
Java 基本分类 • MIDP • MIDP (Mobile Device Information Profile)现已成为一种普遍的工业标准,基于MIDP开发的程序可以在任何设备上运行,它架构CLDC之上。 • MIDP中定义的APIs包括:javax.microedition.lcdui.*, javax.microedition.midlet.*, javax.microedition.rms
Java 基本分类 • CLDC与CDC • CLDC (Connected Limited Device Configuration),它为所有低端消费电子产品的运行提供了最小的库集和APIs。 • CDC (Connected Device Configuration), 它是CLDC的超集,它为高端消费电子产品提供运行环境。 J2EE J2SE CDC CLDC
Java 基本分类 • Android Java的地位 • Android不是java • Android没有java授权(无java logo) • Android虚拟机不标准 • Android binary不兼容java • Android core libraries自己扩展维护
Java虚拟机简介 • Class Loader • 加载class文件到虚拟机 • Execute Engine • 也叫解释器(interpreter),解释bytecode,提交系统执行 • Native Interface • 本地代码调用接口,解释器解释到此标记的native方法后,通此接口加载、调用本地方法。 • Runtime Area • 整个JVM的重点。
Java虚拟机简介 • Runtime Data Area Shared Thread 1 Thread 2 Garbage Collected Heap pc pc Java Stack Native Method Stack Java Stack Native Method Stack Method area
Java虚拟机简介 • Program Counter Register • 每个线程有一个PC寄存器 • Size:1 word(一个指针的大小) • Value • native method (JNI) • Undefined • non-native method : • 当前执行的bytecode的地址。
Java虚拟机简介 • Java stack • 方法调用的参数传递 • 存储调用方法的返回值 • 存取表达式求值的中间结果 • 存储局部变量 • Conventional Stack(C Stack) • 支持本地方法调用(JNI) • JVM bytecode指令翻译成机器指令 • 普通的native栈没多少区别 • 线程创建的时候创建
Java虚拟机简介 • Java 栈帧结构 Pointer to runtime constant pool args+ local vars operand stack Fixed after compile
Java虚拟机简介 • Heap • 所有的class的实例:object都分配在此 • 所有线程共享的存储区域 • 堆的对象分配由指令控制,释放不受控制(垃圾回收) • VM启动的时候创建,一个VM有一个heap • Method Area • 存储每个class的数据结构 • constant pool, field,method data, code for method and constructor, special methods, class variable • VM启动的时候创建,一个VM有一个 • 通常,这也是可以被garbage collection • 通常,在一些VM实现中,也可以放在堆里
Java虚拟机简介 • Heap and Method area Heap 类数据 指针 实例1数据 实例2数据 Garbage Collector 实例3数据 Method Area 类定义数据 - 常量池 - field,method 数据 - Method的bytecode代码
Java虚拟机简介 Class文件结构 ClassFile { U8 magic; U2 minor_version; U2 major_version; U2 const_pool_count; cp_info constant_pool[const_pool_count-1]; U2 access_flag; U2 this_class; U2 super_class; U2 interfaces_count; U2 interfaces[interfaces_count - 1]; U2 fields_count; field_info fields[fields_count-1]; U2 methods_count; method_info methods[fields_count-1]; U2 attributes_count; attribute_info attributes[attributes_count-1]; }
Java虚拟机简介 • General infomation
Java虚拟机简介 • Constant pool
Java虚拟机简介 • Field
Java虚拟机简介 • Method
Java虚拟机简介 • Attribute
Java虚拟机简介 • Java Byte Code • Stack Based • 201 opcodes • Arithmetic • Load and store • Type conversion • Object creation and manipulation • Operand stack manipulation • Control transfer • Method invocation and return
问题: • Java也要编译,为什么说是解释型语言?
Dalvik虚拟机 • Android上虚拟机(Dalvik): • • run on a slow CPU • • with relatively little RAM • • on an OS without swap space • • while powered by a battery
Dalvik虚拟机 • Android虚拟机和标准虚拟机 • 基本理念是一样的 • 基本结构式一样的 • Class文件不一样 • Bytecode不一样 • What is the Dalvik VM • Type-safe, reference-safe • Garbage Collection(mark-sweep) • Run on Modern OS • 智能机,多进程多任务 • Big Class library • 提供常用的j2me库 • Bytecode-based • 单位为16-bit, 共220 opcode • Register based
Dalvik虚拟机 • Dalvik dex文件结构
common system libraries (U) 21445320 — 100% (J) 10662048 — 50% (D) 10311972 — 48% web browser app (U) 470312 — 100% (J) 232065 — 49% (D) 209248 — 44% alarm clock app (U) 119200 — 100% (J) 61658 — 52% (D) 53020 — 44% (U) uncompressed jar file (J) compressed jar file (D) uncompressed dex file 没有压缩的dex比压缩的jar还要小!!!!! Const pool结构冗余太多
public class Demo { public static void foo(){ int a = 1; int b = 2; int c = (a+b) *5; } }
public static void foo(); Code: Stack=2, Locals=3, Args_size=0 0: iconst_1 1: istore_0 2: iconst_2 3: istore_1 4: iload_0 5: iload_1 6: iadd 7: iconst_5 8: imul 9: istore_2 10: return
Demo.foo:()V: regs: 0002; ins: 0000; outs: 0000 0000: code-address 0000: local-snapshot 0000: code-address 0000: code-address 0000: local-snapshot 0000: const/4 v0, #int 1 // #1 0001: const/4 v1, #int 2 // #2 0002: add-int/2addr v0, v1 0003: mul-int/lit8 v0, v0, #int 5 // #05 0005: code-address 0005: code-address 0005: local-snapshot 0005: return-void 0006: code-address
离线编译过程 • C/C++等native代码,走完整的过程 • Java走了一半 • Javascript一个没走
Dalvik 源码结构 • VM • 虚拟机主框架 • Oo • Operation on object • Interp/mterp • 虚拟机的解释器 • Hprof • Profile工具 • Jdwp(Java debug wire protocal) • Compiler • JIT的runtime编译功能 • Arch • JNI call bridge • Native • Java core libraries的底层支持,不是通过jni实现,直接虚拟机实现 • Alloc • Heap的操作