jvm 初篇 — 初识字节码

本文章总字数:986, 阅读需要5min

在日常的程序开发中啊,我经常遇到代码跑不起来的情况,然后我同事就和我开玩笑:人和代码,只要有一个能跑就行。那我就想了我是用两条腿跑的,那代码是怎么跑的呢?出于这个好奇心,今天就由我来揭开jvm的神秘面纱,看看我们写的代码究竟是怎么跑的?

思考ing
那从哪下手呢?我就陷入了思考,思考ing,3分钟过后,我有了一个idea!既然java是面向对象的语言,那人是怎么跑的?你可能会说:这还用问,当然是用腿啊。那既然腿是人跑步的执行器,那腿怎么知道什么时候要跑呢?那当然是靠神经传导,信号到达,传递跑的信息,腿就知道了呀!那我们知道,jvm那么聪明它是不是也是这样通过指令跑的呢?

验证ing
好了,我们假设jvm和我们一样,也是通过指令跑的,那我们就要验证它到底是不是这么做的,那怎么去验证呢?我是不是得去问问jvm啊,于是乎,我决定写个hello,问候一下,代码如下:

image.png

运行结果如下:

image.png

咦,jvm竟然知道我要干什么呢,竟然能猜透我的心思,真是比现实复杂的世界好太多了呢。

解析ing
这确实是我要的结果,但是它怎么知道我要什么呢?佛说:种瓜得瓜,种豆得豆,种对象也必然得到对象,但很明显机器是读不懂我们人类通俗的语言的,也就是说不具备真正的智能,那我们就需要对我们自己写的代码进行解析,看看代码世界里到底发生了什么,注意:我们要进入到微观世界了,那里更有意思。

微观世界
于是乎,我打开了微观世界的入口:javac Desktop\hello\src\Hello.java,//java->class
javap -c Desktop\hello\src\heima\Hello.class //反汇编

世界的大门开了:

image.png

我惊了,这都是什么妖魔鬼怪啊,除了字母认识,剩下的都不认识,这就是一个一个古老的咒语刻在石碑上,等着我们来揭秘,于是乎我开始万能的Google,来破解这稀奇古怪的咒语。

经过漫长的Google,我有了一点头绪,不会就学嘛,怕什么呢?
我们可以看到,出现次数比较多的指令就是load和store,那是什么意思呢,我画了一张图,帮助大家理解:

image.png

解谜

首先 code 0 :aload_0 //加载局部变量表的信息到栈中
     code 1 :invokespecial //invoke 应该是调用的意思,这里是调用Object类的空参
     code 4return //返回
接着 main方法:
     code 0 : new //创建类的实例指令
     code 3 :dup //压栈
     code 4 :invokespecial //invoke 应该是调用的意思,这里是调用了初始化的方法
     code 7 :astore_1 //load的反方向
     code 8 :getstatic //打印流的方法
     code 11 :aload_1 //同上
     code 12 :invokevirtual //调用打印流的换行打印方法
     code 15return
复制代码

结束
在微观世界探索这么久,脑子和身体都有点顶不住了,因为我也不是很懂,还在学习,如有错误请大家多包含,我就是想以我的视角来带领大家认识一下jvm,帮助java程序员了解和认识jvm,希望能和更多的java开发者一起交流和学习,我是CocaCoder,一个不是那么会写文章的程序员,我们下期见。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享