这篇笔记总结、摘选自周志明老师的《深入理解Java虚拟机第3版》,以及其他网上知识点收集,只是我自己的个人复习笔记,禁止转载,如有侵权,请联系我删除。
思维导图版本点击这里
虚拟机概述
中间语言翻译(从Java翻译到机器码)
从中间语言翻译到机器码
通过C语言翻译(初JVM)
通过将字节码class翻译成C语言,比如定义iadd这个字节码是相加的助记符,然后通过c语言来解析字节码中的iadd就是相加,并指向对应的c语言相加的c程序来做实际运算,这样子的话,这个解析字节码的C程序就是所谓的JVM,最简陋效率最低的初代JVM
直接翻译为机器码
CS:IP
CS与IPO这是物理CPU内部的两个寄存器。对于一台物理机器而言,这两个寄存器是最重要的寄存器,因为CPU在取指令时便完全依靠这两个寄存器。CS寄存器保存段地址,IP保存偏移地址。CS和IP这两个寄存器的值能够唯一确定内存中的一个地址,CPU在执行机器指令之前,便通过这两个寄存器定位到目标内存位置,并将该位置处的机器指令取出来进行运算。函数跳转的本质其实便是修改CS和IP这两个寄存器的内容,使其指向到目标函数所在内存的首地址,这样CPU便能执行目标函数了。Java虚拟机要想让物理CPU直接执行Java程序所对应的目标机器码,也得修改这两个寄存器才能实现。
在C语言中,能够使用语法糖来修改CS:IP段寄存器,这样C程序就能直接动态执行机器码。
既然都能在C语言中直接动态执行机器码了(可以简单理解为:C语言的变量里面可以复制解析出来的机器码,然后直接执行),我们只要将中间语言指令直接翻译为机器码,然后让CS:IP直接指向这段机器码执行,这也是现代JVM最重要的的基本原理之一。