手把手教你撸一个Mini JVM系列(4)之执行引擎

引子:

这是本系列的最后一篇文章(后面如果有必要的话会写一篇关于mini jvm代码实现, 类结构的文章, 让大家更好的理解), 介绍一下jvm的执行引擎. 其实一个执行引擎要做的事情就是找到class的main方法, 然后从main方法开始执行整个程序, 直到程序结束. 而执行的代码就在之前解析的方法数据结构中的Code Attribute属性中.

1. 运行时栈帧结构

之前解析的class文件都是一些静态的结构, 当执行引擎运行的时候需要把之前静态的结构转成运行时的结构. 先来看一看JVM的运行时结构

图1-1 RUNTIME_STRUCT

因为JVM是一个基于栈的虚拟机, 所以基本上所有的操作都是需要通过对栈的操作完成的. 执行的过程就是从main函数开始(一开始就会为main函数创建一个函数栈帧), 执行main函数的指令(在Code Attribute中), 如果要调用方法就创建一个新的函数栈帧, 如果函数执行完成就弹出第一个函数栈帧.

2. JVM的指令

不管你在java源文件中写了什么函数, 用了什么NB的算法, 经过编译器的编译, 到了class文件中都是一个个的字节, 而Code Attribute中的code[]字段中的字节就是函数翻译过来的字节码指令.

JVM支持的指令大致上可以分成3种没有操作数的, 1个操作数的, 2个操作数的. 因为JVM用一个字节来表示指令, 所以指令的最多只有256个.

JVM指令通用形式如下:

INSTRUCTION

所以mini jvm就是要用java来执行JVM的指令来完成功能

3. 几个常用的指令解析

因为jvm的指令太多了, 在这里不可能全部都解析一遍, 所以就选择了几个mini jvm中比较关键的也已经实现了的指令进行解析

3.1 invokespecial

INVOKESPECIAL

说明: invokespecial用于调用实例方法, 专门用来处理调用超类方法、私有方法和实例初始化方法.

indexByte1和indexByte2用于组成常量池中的索引((indexbyte1 << 8)|indexbyte2). 所指向的常量项必须是MethodRef Info类型. 同时该条指令还会创建一个函数栈帧, 然后从当前的操作数栈中出栈被调用的方法的参数, 并且将其放到被调用方法的函数栈帧的本地变量表中.

3.2 aload_n

ALOAD_N

说明: aload_n从局部变量表加载一个 reference 类型值到操作数栈中. 至于从当前函数栈帧的本地变量表中加载哪个变量是有N的值决定的.

3.3 astore_n

ASTORE_N

说明: 将一个 reference 类型数据保存到局部变量表中. 至于保存在局部变量表的哪个位置就由N的值决定.

好了, 指令就介绍到这里, 要看所有指令的说明可以看oracle的jvm指令集. 里面有对每一个指令的详细说明.

所以执行引擎要做的工作就是根据每一个指令要执行的功能进行对应的实现.
至于到底是怎么做的就请大家看代码吧, 这里就不详述了.

4. 总结

对于真正的jvm, 现在实现的mini jvm的功能真的是太弱太弱了, 但是即使是实现这么弱的功能也花费了我大概一个月的时间, 可想而知真正的jvm的功能的强大以及其的复杂度.
这次的mini jvm主要是对之前看的一些jvm的文章书籍的一次实战演练, 虽然实现的功能比较弱, 但是更加形象的了解了jvm的组成, java代码的执行流程, 虽然还不能像第一篇文章开头说的那样对自己写的每一个字节都了如指掌, 但是相比较以前也是有了长足的进步.
总之, 这次的mini jvm自己是受益良多. 其中代码中留下的一些todo在后面也会慢慢的补充, 如果有同学感兴趣的话欢迎一起来完善这个"小玩意".

5. 代码地址

6. 参考

  1. The Java® Virtual Machine Specification
  1. 深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)
  1. 深入java虚拟机第二版

7. 本系列其他文章

手把手教你撸一个Mini JVM系列(1)之解析Class File -- 初探
手把手教你撸一个Mini JVM系列(2)之解析Class File -- 常量池
手把手教你撸一个Mini JVM系列(3)之解析Class File -- 字段、方法、属性
手把手教你撸一个Mini JVM系列(5)之源码分析 -- 常量池、访问标志、类索引
手把手教你撸一个Mini JVM系列(6)之控制流 -- 条件判断和循环

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容