00:00
那我们通过三个例子啊,就带着大家来熟悉一下啊,这个我们说的自解码指令,那通过这个呢,也进一步证明了啊,对于我们说Java程序员来讲,那我们从代码层面看不到的东西呢,实际上呢,是可以借助于字节码指令的一个执行过程,来查看一下中间的一个执行细节啊,这个呢是非常重要的。那这个之前给大家也提到个例子啊,在给这个超赞中心培训的时候呢,他们更多的关注的啊,当然这个是没有问题的哈,就是关于这个性能的一个,呃,这个大化程序的一个监控和性能的一个调优,那么他们更多的关心的是垃圾回收器啊,包括这个主要呢,就是垃圾回收器啊,包括一些GM参数的一些调优上,呃,他们是不需要呢,是呃来这个讲这码文件的啊,主要原因呢,就是因为测试工程师呢,他们不需要呢,去编写Java程序,或者说呢,他们对这个Java语言的话也不是足够了解,而事实上呢,我们要想进行GM调优的话呢,一方面是JC的一个调优,另外一方面呢,主要就是代码层面的一个调啊,这方面大家还不能小看了,这个代码层面,呃,调优的这样的一个地位啊,啊有的时候一些代码错误的编写方式,或者说呢,不够好的编写方式,重复的去执行,它的效率呢,确实会很差啊是这样一个情况,那对于我们张大成员来讲的话呢,我们就需要呢,关注于这个最解码文件是吧?诶这个呢,也是比较重要的一点啊OK,那接着呢,我们来看一下这个。
01:20
课件啊,接下来呢,我们就来来使用这个class文件呢,来进行一个解释说明啊,首先呢,我们来看一下说自解码文件里边到底存的是什么。哎,我们看啊说这个源代码啊,有我们所说的这个原程序啊,经过编译器前端编译器编译之后呢,会生成一个自己码文件,当然这个自己码文件到底有几个呢?取决于我们原程序当中呢有几个类啊,一般呢,我们说呃,一个点查文件我们就放一个类了,是吧?当然呢,如果你要有内部类的话呢,这个单独的一个内部类也会生成一个独立的自解码文件啊,这个大家都清楚啊,也所以这块准确的讲的是一个或多个自解码文件,那么自解码文件呢,首先注意它是一个二进制的类文件。
02:00
啊,以类为代表的啊,当然接口呢,也也会生成相应的这个字节码文件啊,它的内容呢,就是GM的指令,或者我们可以称为呢,叫做自解码指令。啊,这是没有问题的,它呢不像我们说的C或者C加加,哎经编译器呢,直接生成的叫机器码对吧?哎,机器码这个概念咱们前面也都提到过啊,这个C或C加加呢,是直接呢进入编译器生成机器码,这个呢,呃,也是使得呢C或C加加呢高效的原因,对吧?诶昨天我们也提到一个概念,就是说这个一个语言呢,它的高效与否,其实主要跟编译器有关系,这个语言本身呢是无罪的是吧?诶是没有太大关系的啊那我们也提到了一个叫AOT啊at呢,其实主要呢,也是想着,哎,像我们这个C或C加加一样,这样啊,直接生成这个机器码,OK,那J器的话呢,我们说它的好处就是呃,预热之后啊性能会高,但一开始的时候效率会偏差一些啊,就程序刚执行的时候,好,那下边来说,呃,既然提到了磁件码文件当中是呃GM指令了,那到底什么是自节码指令呢?哎,这个呢非常重要啊,大家看这个自解码指令。
03:08
啊是扎va逊尼当中的一个字节长度的,代表着某种特定操作含义的来提到一个词,叫做操作码啊,Up code啊叫做操作码,这个词呢,大家记住它啊,也说一说啊,操作码以及呃,跟随在其后的零个至多个代表此操作所需参数的叫做操作数。的啊,这个操作数和操作码共同呢,就构成了一个叫自解码指令。那也发现呢,有一些虚拟机指令当中是不包含操作数的啊,只有一个操作码,那好处呢,当然就是节省内存空间嘛,对吧?哎,使得我们这个资拟码文件呢就比较小,那呃,简单来说的话呢,就是自件码指令啊,大家呢,就是这样来理解,呃,主要呢,是有两部分构成啊,一个呢叫做操作码,对吧,然后再加上一个我们叫做操作数,当然呢,哎,真正这个你看这个磁解码指令的时候,中间不是个加号,它是一个空格来表示的,它俩合在一起构成一个叫做磁解码指令,当然有一些呢,哎,我们说呢,就没有这个操作数了。
04:09
哎,就这样的一个概念,好,那我们给大家举例子啊,这呢,我下边也放了个图,咱们呢就不在这看了,直接呢看一下咱们前面举的这三个例子,随便我们挑一个,比如说叫inter test,我们来查看一下它的这个自解码的一个这个指令的一个情况啊,比如说呢,针对于它的这个may方法,然后我们看这个code,那这里边呢,就是一个一个的自解码指令了,对吧?那这些指令当中,比如说我们看一下叫啊store,诶杠三啊,这个呢,是我们下一章重点给大家讲的这个指令的含义了啊,我们分类别的给大家去介绍这个store的杠三呢,就是说我们是一个引用类型的变量啊,把这个引用类型的变量呢,我们存储在局部变量表角标为三的这样一个位置上。那么这个指令呢,大家又说就发现呢,它仅仅是一个操作码。对吧,诶然后它就没有后边那个操作数了,呃,其实严格上来讲的话呢,这个杠三,呃这个其实就是它那个操作数,只不过呢,我们对于啊to来讲呢,它有这个现成的这样的几个可以去用啊大家你看啊a store杠零杠一杠二杠三,诶这些呢,就是有现成的了,你要说我想存储在第四个位置怎么办呢?那你就需要呢,使用操作码,然后配上一个操作数了。
05:22
哎,就得单独你再去配一个操作数才可以。啊,这个我们看下边有没有类似的这个情况啊,我们再接着去存储。A store3,嗯,应该是有的是吧,那你看这块S到五,那这个时候呢,诶包诶包括上面应该还有这个s store4是吧?诶这个时候呢,你像存储在角标为四的位置,因为我没有现成的这几个可以用了,那那你就只能采用啊操作码配上一个操作数的方式,包括下边上边这个叫BI push,然后十啊将一个字节的这种啊其实整形了啊,把它呢,诶十放到这个操作站当中,哎这个呢,就是操作码配上一个操作数对吧,正常来讲其实都是这样子的啊,只不过呢,就是我们经常性的去操作像角标零,角标零呃123等等这些呢,属于比较常用的一些位置,所以呢,就诶直接呢诶给你分配一个现成的一个操作码,不用在后边加操作数了,节省我们这个随件码文件的这个空间啊。
06:17
这个应该很好理解,好再往下,那我们该如何去解读这个词,解码这个文件,这些指令呢,是吧,还是个二进制的啊,怎么去看呢?哎,这儿呢,大家会发现啊,其实我下边已经写了,一共有三种方式,大家会发现呢,就是呃,咱们现在呢,其实已经在解读了。对吧,啊,正常来讲的话呢,我们这个是原文件啊,这个原文件的话呢,编译之后呢,这不是会生成资金码文件吗?咱们找一下。那那这个资金码文件不就是这个嘛,诶我们把它呢,CTRLC一下,举一个例子,咱们比如说放到这个桌面上啊,CTRLV啊粘到这儿,诶这个呢,其实就是一个资金码文件了,这个呢,其实主要不是让咱们看的啊,你像你这块打开,比如我用ID的plus打开。
07:02
然后选一个呃否吧,你看就成这样了是吧,那这块呢,解读肯定是没有意义了,那我们怎么去看这个磁激码文件呢?诶大家会发现呢,咱们其实。哎,刚才呢,我在这个。哎,这个我的光标呢。我在这个idea当中,哎,咱们使用这个插件,这个插件呢,叫做j lab啊,使用这个插件的话呢,其实我们现在就是在解读了。所以说呢,在idea当中安装一个j lab这个插件呢,就能够方便我们去解读这个安装插件呢,大家应该都清楚啊,在我们idea当中,大家去选这个叫a plug ins是吧?Plug ins里边呢,呃,你在这个诶marketplace这里边,你去输入这个接lab啊就可以安装,是安装完以后呢,我们这个首先呢,需要把当前这个原文件呢做一个编译。是吧,点击一个编译。啊,编辑完以后呢,比如说我们这个程序里边,假设你有好几个类啊,你看我们这里边不是有三个类嘛,那就有三个自写码文件了,你想看哪个自写码文件呢,你就把光标呢放在哪一个类上面,然后呢,在这个位置view这块呢,你点击一下啊,它自然而然就会出现叫收back code啊,With Jack class lab啊点击一下这个呢,我们就能查看,哎,是当前的咱们这个萨是吧,哎萨这个类啊,就这样来查看啊呃,这呢是我们使用的这个插件,那这个Jack live呢,它其实也有一个客户端。
08:25
啊,这个客户端呢,也给大家在这个课件里边也放了啊软件。呃,这个接lab是吧,哎,这就是客户端啊,这个客户端装完以后呢,那我这个时候呢,拿出来的这个自解码文件啊属性我这呢就自动的使用这个杰alive呢,做一个,呃,这个查看是吧,双击一下。好,那这时候呢,我们就是通过一个客户端的方式呢,来呈现的啊,大家把这个打开之后呢,你看就长这个样子是吧。哎,这样的样子,咱们刚才呢,这不看的是这个main方法里边的这个扣的属性,哎,相对应的这个叫最起码指令嘛,哎就在这儿这个字稍微小一点啊,这块看到的效果呢,跟咱们在这个idea当中,这块看到的效果呢,实际上是一样子的。
09:09
啊,一样子的,这个对应的是啊,我在课件里边写的这个方式三。啊,是这个方式三,那这个呢,当然可视化呢是吧?哎,效果是不是非常好啊,哎,这个是没问题的啊,那后续呢,咱们要用的话呢,主要用的其实都是这个方式三,对啊,后续咱们要用都是方式三,那除了这方式三之外呢,我们说还有最基础的一种方式,就好比是咱们一开始学Java程序的时候,大家都用70分写,当然真正开发的时候呢,我们用的都是集成开发环境,对吧?那我们现在呢,诶刚开始接触自解码文件,咱们呢,也看看如何最基础的去看待这个文件呢,哎,我们就不用这么高级的工具了,怎么办呢?诶大家把它呢打开这个时候呢,比如我使用这个叫哎notepad加加啊为什么用它呢?诶因为这里边有个插件啊,你看现在我打开呢,跟咱们刚才用这个ID plus打开,其实效果呢是一样的是吧,哎,这个显然是不行的啊,那在咱们这个。
10:02
Notpa加加里边啊,大家可以去装一个插件啊,这个插件的安装呢,这块这不可以找这个插件的这个管理者,呃,在这个件市场上大家去安装就行啊,哎,装这个呃,16进制的一个editor啊,View in是吧?哎,展示为16进制啊点击一下好,这个时候呢,大家你会发现啊,好像不像刚才这样感觉像是乱码了,诶我们就能够查看这个文件,这个文件里边呢,像这些这个部分啊。哎,从这块开始,这块的部分一直哎往下这个呢,都是我们的这个自写码文件啊,相对应的这一个,这就是一个啊字节啊,一个一个的字节这样的一个方式。哎,那咱们要解析的话呢,最原始的方式就是我们自己亲自的去看这里边的一个一个的这个,呃,16进制所代表的这个这个数值啊,它对应的是一个什么样的操作码,或者是一个具体的操作数。啊是这样的一个情况啊,这个就是我们说最基本的一个情况啊,这个用它是可以的,就是我们说这个notpad加加是行的啊还或者的话呢,大家啊,有另外一个工具呢,可以去安装这个,我在这个软件里边也放了啊就这个啊叫bary viver啊呃,大家去网上下载也行,把它呢安装好以后双击打开。
11:18
啊,也是比较简单的一个工具啊,专门来看这个二进制数据的啊,打开之后呢,大家把呃,这个词解码文件呢,你直接拖进来。好,这个我们再放大一下,哎,这个时候呢,大家看到的效果呢,基本上。啊,基本上跟咱们刚才说的这块啊,看到的这个情况呢,是一样子的啊,一样子的好处的一点,你说是什么呢?哎,只不过就这里边,比如我们看到一个这个诶0A是吧,这个0A的话呢,对应的这个十进制是多少,它这呢相对来说比我们用notepad加加呢,这个信息量稍微的就大一些啊还仅此而已,好那咱们呢,呃,下边来带着大家去解读词解码文件的时候呢,咱诶咱们可以用这个啊哎,或者你用这个当然也行啊,都OK啊行这呢是我们说的这个。
12:02
呃,也算是这个叫第二种方式啊,实际上是对应的这个方式一,刚才不是说了个方式三嘛,那还有一种就是使用这个扎P的一个指令啊,这呢是三种方式扎P这个指令呢,实际上是我们JDK自带的啊,当然呢,直接在我们JDK的这个目录下。找一下我的安装位置。呃,1.8是吧,哎,并目录像啊,在这里边儿呢,我们可以发现有一个叫扎P的一个指令。啊,这个咱们前面其实讲这个站的时候呢,也带着大家呢,演示过这个指令啊,这个扎P的这个指令呢,诶,它可以帮我们去反解析,或者你要反编译一下我们这个自解码文件啊,都是可以的啊都是可以的啊那具体怎么用呢?呃,大家一方面呢,你可以把你这个自解码文件呢,直接呃就是放到一个桌面上呀,或者放到一个文件目录下呢,直接反编也行,或者呢,比如我们在idea当中去操作,看怎么做呢。其实就是这样操作哈,不能呢,针对于我们这个资金码文件,呃,这个class这个这个点文件了啊,咱们针对的应该是这个自金码文件是吧,比如说呢,就是inte test啊,嗯,我要找到它所在的路径啊,这不就在这儿嘛,那在我们这个idea当中有一个快捷操作啊,直接呢去选择啊,Open in a terminal啊点开。
13:16
好,那此时的话呢,它自然而然就定位到了,哎,我们这个路径Java路径下是吧,是不是在这个out下嘛,在这是吧,好在这下边的话呢,我们去输入一个指令啊,我们叫扎P啊杠V啊,接下来呢,大家把这个class文件的这个名写上啊,Integer啊。啊。嗯,Test点哎class啊哎,然后点一下回车。那这个时候呢,我们就能看到啊,这个解析以后的这个相应的这个数据了。你看这个数据就在这儿,跟咱们刚才呢,在这块看这个,呃,通过这样的一个插件啊,看到这个效果呢,其实也是一样子的啊,你要是觉得在这块看呢,感觉还是有点,呃感觉太长了是吧?怎么办呢?还可以这样啊,把刚才命令调出来,那这个呢,我们可以给它去输入到啊,比如说叫integer。
14:06
引起的test是吧?哎,第二,哎,我们放到一个TXT文件当中啊,这也是可以的,那我点一个这个回车。那这就执行好了,那执行好以后呢,我们会发现呢,给我做一个啊,其实已经出来了是吧,不用刷新了啊,你要没出来呢,你刷新一下,然后把这个文件呢,我们比如说CTRLC一下你放桌面。哎,把这个文件呢,双击打开。你那这就可以了啊,在这儿呢,大家来看这个T文件呢,也是可以的,这是相当于咱们是导出来以后。对吧,那咱们使用的是JP的一个指令给它导出来了,那以后大家进行查看也行,这个呢,是我们JDK呢自带的一个指令,那在咱们这个B目录下啊,大家如果是开发的话呢,其实主要呢,咱们接触的就是Java c和Java啊,一个是前端编译器,一个是解释运行是吧?呃,主要是接触这俩,然后除了这两个之外呢,其他的还有一些指令,比如说这个,呃,JCMD啊,J conso啊,呃,解啊解INF啊,GOS啊是吧,这些指令呢?呃,JPS啊是吧,等等,咱们的下一篇给大家讲解这个,呃。
15:11
这个大化程序的监控和性能调的时候呢,这里边很多指令都是我们要给大家讲解的,OK啊,J sta啊,J state啊等等是吧?哎,这我们是下一篇给大家来讲啊,那这一篇里边呢,我们主要接触的就是扎P这个指令,好那总结一下啊,咱们这里呢,讲了三种方式啊,大家呢,去做一个最起码文件的一个解析,那后续呢,咱们肯定用的是方式三,但是我们现在刚开始讲最金码文件,咱们呢,诶使用一下方式一带着大家呢去熟悉。好这块呢,大家呢,也可以稍微的自己来演示一下啊,安装一下相关的这个软件和插件啊。
我来说两句