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