移动系统中的 java 虚拟机
DESCRIPTION
移动系统中的 Java 虚拟机. 徐伟刚. Java 简介. Java 是一种面向对象的编程语言 一次编译,到处运行 全世界有超过 1000 万 Java 开发者. Java 发展简介 -Sun. 1995 年 Sun 公司发布 Java 语言 1996 年发布 JDK1.0 1999 年发布 J2SE 、 J2EE 、 J2ME 标准 2006 年 Sun 以 OpenJDK 开源 Java 2009 年 Oracle 收购 Sun. Java 发展简介 - 移动 Java. J2ME: Nokia 、 Jblend 、 Mirand Android. 矛盾. - PowerPoint PPT PresentationTRANSCRIPT
移动系统中的 Java 虚拟机徐伟刚
Java 是一种面向对象的编程语言一次编译,到处运行全世界有超过 1000 万 Java 开发者
Java 简介
1995 年 Sun 公司发布 Java 语言1996 年发布 JDK1.0
1999 年发布 J2SE 、 J2EE 、 J2ME 标准
2006 年 Sun 以 OpenJDK 开源 Java
2009 年 Oracle 收购 Sun
Java 发展简介 -Sun
J2ME: Nokia 、 Jblend 、 Mirand
Android
Java 发展简介 - 移动 Java
Java 虚拟机的性能追求移动系统的限制 CPU – 芯片厂商技术能力 内存 – 价格 功耗 – 无持久电源
矛盾
Java 虚拟机架构
compiler
binary convertor
binary optimizer
interpreter
JIT
stack
heap
thread
JNIDebugger &
profiler
binary loader
format engine mechanism
Java 虚拟机架构
Java 虚拟机 - 指令体系
Java 使用与平台指令无关的字节码虚拟机解释执行字节码
Java 虚拟机 - 指令模式栈式 寄存器式
操作数位置 方法调用栈帧 虚拟机寄存器解释器效率 指令数目多,低效 指令数目少,高效编译器实现难度
临时变量在栈上,易实现
需高效的寄存器分配算法进一步优化可能
与 CPU 指令相差较大,优化难度大
与 CPU 指令较为接近,在汇编解析器、芯片优化等方面均有可能进一步优化
Java 虚拟机 - 指令体系以 java 代码为例:
a = b + c
栈式指令:ILOAD cILOAD bIADDISTORE a
寄存器式指令 :l_add a, b, c
Java 虚拟机 - 解释器指令分发for(;;) {
ins = fetch_next_instruction();switch(ins) {case OP_001:
handle_OP_001;break;
case OP_002:handle_OP_002;break;
……}
}
switch-case version
Java 虚拟机 - 解释器指令分发handle_addresses[];……pre-calculate_handle_addresses();……for(;;) {
ins = fetch_next_instruction();goto handle_addresses[ins];
}
goto-address version
Java 虚拟机 - 解释器指令分发#define GOTO_OPCODE(_reg) add pc, rIBASE, _reg, lsl #6…….balign 64.L_OP_001: FETCH_ADVANCE_INST GET_INST_OPCODE(ip) GOTO_OPCODE(ip).balign 64.L_OP_002: GOTO_OPCODE(ip)……
align-goto version(Dalvik ARM)
Java 虚拟机 -JIT
hot spot
fetch instruction
interpret instruction
compiled
code cache
compile queue
instruction decode
flow graph
code generatorexecute code
cache
YN
YN
interpreter JIT compiler
SSA
Just in time compiler – 及时将热代码翻译成目标机器指令执行
Java 虚拟机 -JIT 优化点
消除指令分发使用物理寄存器基于目标指令优化基于动态信息优化
Java 虚拟机 -JIT 优化点示例a = b + c;e= a + d;
fectch_opload R1 <- bload R2 <- cR3 = R1 + R2store a <- R3goto_next_opfectch_opload R1 <- aload R2 <- dR3 = R1 + R2store e <- R3goto_next_op
load R1 <- bload R2 <- cR3 = R1+ R2load R4 <- dR5= R3 + R4store e <- R5
Java 虚拟机 - 对象访问
Java 对象 vs C 指针gc 影响resolve
Java 虚拟机 - 内存
gc 指标 - 吞吐量、碎片率没有最好,只有最合适
Java 虚拟机 - 内存 移动 vs 非移动移动式 非移动式
碎片 无 有
分配效率 高 低
gc 效率 低(大内存特别严重) 高
并行 gc 可行性 业界无方案 可行
Java 虚拟机 - 安装预优化
提前 resolve
函数 inline/JIT inline
Java 虚拟机 - 功耗
受目标芯片架构限制例如 ARM ? Thumb?
Java 虚拟机 - 发展
编译器优化动态特性字节码 native 化定制化内存管理
谢谢