在jvm内部,最精华部分就是执行引擎和GC。执行引擎有字节码解释器,模板解释器以及JIT即时编译器。
物理机器执行指令的流程是:
- 取指(操作码+操作数构成),取指入寄存器
- 译码
- 执行 (取操作数+运算)
- 取下一条指令
jvm没有空转机制,所以一旦处理完自身的初始化逻辑,就会进入Java程序,执行字节码指令。
取指
Java字节码指令都是1个字节 的,这也是为什么字节码指令少于256个的原因。
iconst_3这种指令,是将操作码与操作数都合并在1个字节里面,目的是为了节省内存,jvm为了节省空间专门定义了iconst_0-iconst_5这6条指令。
对于不超过127的整数,使用bipush 指令,超过的使用 sipush,超过32767则放在常量池(编译阶段在常量池,运行时也存放在常量池)中。
在hotspot内部与CPU中的译码器类似的叫做“解释器”,hotspot提供了好几种解释器,如字节码解释器bytecodeInterpreter,模板解释器templateInterpreter等。
模板解释器是默认的解释器,所有的字节码指令都通过grereate_and_dispatch函数来生成对应的机器指令(使用汇编器,默认是模板汇编器)。该函数还实现了指令跳转(即取下一条指令的逻辑)。
对于模板解释器,每个字节码指令都会关联一个生成器函数,用于生成字节码指令的本地机器码。
二级取指:
取下一条字节码指令,存储到ebx寄存器中,跳转到jvm中字节码对应的本地机器码实现。
栈顶缓存是jvm的一项优化措施,向栈顶加载一个数据时,不直接放在栈顶,而是先放在eax寄存器中,下一条指令再决定是否将寄存器中的数据放回栈顶还是直接参与运算。
由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。
优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。
JIT编译器,能够针对热点代码使用多种优化策略进行优化,提高热点代码运行效率。Hotspot还针对客户端和服务端分别开发了C1和C2两层编译优化功能。
C1做简单优化,C2用于服务器端,做深层次优化。
一般来讲,JIT编译出来的机器码性能比模板解释器高。
再一个优化策略是“线程逃逸”,如果一个java对象不会逃逸到其它方法中,且类中的变量都是简单类型时,直接在栈上分配。如果一个Java对象不会被其它线程访问,可以取消方法的同步措施。
栈帧重叠,就是调用方的操作数栈和被调用方的局部变量表重叠。
附录:
常量池对象在内存中的值:
hsdb> mem 0x000000001c4f0078 200
0x000000001c4f0078: 0x0000000059b72cd8 //mark
0x000000001c4f0080: 0x000000001c4f0028 //meta_data
0x000000001c4f0088: 0x000000001c4f1570 orig_length
0x000000001c4f0090: 0x000000001c4f12c0 cache
0x000000001c4f0098: 0x0000000000000000 pool_holder
0x000000001c4f00a0: 0x000000001ebcfcb0 operands
0x000000001c4f00a8: 0x000000001c4f16e0 flags
0x000000001c4f00b0: 0x0000004700000000 lenth 长度71,有70个元素
0x000000001c4f00b8: 0x0000000000000000 isconc_safe
0x000000001c4f00c0: 0x000000001eba7de0 tags
0x000000001c4f00c8: 0x0000000000000000 常量池第0个元素
0x000000001c4f00d0: 0x00000000002c000f
0x000000001c4f00d8: 0x00000000002d0007
0x000000001c4f00e0: 0x000000001ebe5470
0x000000001c4f00e8: 0x00000000002f0007
0x000000001c4f00f0: 0x0000000000310030
0x000000001c4f00f8: 0x0000000000330032
0x000000001c4f0100: 0x000000001c4f12c0
0x000000001c4f0108: 0x0000000000350007
0x000000001c4f0110: 0x0000000000360007
0x000000001c4f0118: 0x00000000000096a5 //38565
0x000000001c4f0120: 0x0000000000380037
0x000000001c4f0128: 0x0000000000390007
0x000000001c4f0130: 0x00000000003a0037
0x000000001c4f0138: 0x00000000003b000f
0x000000001c4f0140: 0x000000001c4f1080
0x000000001c4f0148: 0x000000001ebe55d0
0x000000001c4f0150: 0x0000000002f72950
0x000000001c4f0158: 0x000000001ebe5790
0x000000001c4f0160: 0x000000001ebadea0
0x000000001c4f0168: 0x0000000002f2b4c0
0x000000001c4f0170: 0x0000000002f73110
0x000000001c4f0178: 0x0000000002f70c80
0x000000001c4f0180: 0x0000000002f72850
0x000000001c4f0188: 0x0000000002f6f050
0x000000001c4f0190: 0x0000000002f6f080
0x000000001c4f0198: 0x0000000002f6f0a0
0x000000001c4f01a0: 0x000000001ebe56f0
0x000000001c4f01a8: 0x000000001ebe57f0
0x000000001c4f01b0: 0x000000001ebe53f0
0x000000001c4f01b8: 0x000000001ebe5210
0x000000001c4f01c0: 0x0000000002f727c0
0x000000001c4f01c8: 0x0000000002f70cd0
0x000000001c4f01d0: 0x0000000002f72b80
0x000000001c4f01d8: 0x0000000002f2ad10
0x000000001c4f01e0: 0x0000000002f74b50
0x000000001c4f01e8: 0x000000001ebe5410
0x000000001c4f01f0: 0x000000001ebe52f0
0x000000001c4f01f8: 0x0000000002f9e600
0x000000001c4f0200: 0x000000001ebe5810
0x000000001c4f0208: 0x000000001ebe5430
0x000000001c4f0210: 0x0000000002f70c90
0x000000001c4f0218: 0x0000000002f6eff0
0x000000001c4f0220: 0x000000001ebe5450
0x000000001c4f0228: 0x00000000001f0016
0x000000001c4f0230: 0x0000000000110010
0x000000001c4f0238: 0x000000001ebe5470
0x000000001c4f0240: 0x0000000000150014
0x000000001c4f0248: 0x000000001c10d360
0x000000001c4f0250: 0x00000000003f003e
0x000000001c4f0258: 0x000000001c279778
0x000000001c4f0260: 0x0000000000170041
0x000000001c4f0268: 0x000000001eb202e0
0x000000001c4f0270: 0x0000000000170016
0x000000001c4f0278: 0x00000000001f001e
0x000000001c4f0280: 0x000000001c1a9d58
0x000000001c4f0288: 0x0000000000440043
0x000000001c4f0290: 0x0000000000130012
0x000000001c4f0298: 0x0000000000460045
0x000000001c4f02a0: 0x00000000001f0028
0x000000001c4f02a8: 0x000000001ebe54d0
0x000000001c4f02b0: 0x0000000002f6e580
0x000000001c4f02b8: 0x0000000002f7e1a0
0x000000001c4f02c0: 0x0000000002f7dcb0
0x000000001c4f02c8: 0x0000000002f7df90
0x000000001c4f02d0: 0x0000000002f70ca0
0x000000001c4f02d8: 0x0000000002f6e830
0x000000001c4f02e0: 0x0000000002f726b0
0x000000001c4f02e8: 0x0000000002f72740
0x000000001c4f02f0: 0x0000000002f72640
0x000000001c4f02f8: 0x0000000002f72810