当前位置: 首页 > news >正文

营销网站开发公司阿里关键词排名查询

营销网站开发公司,阿里关键词排名查询,广西壮族自治区地图全图,个人网页设计理念大神链接:作者有幸结识技术大神孙哥为好友,获益匪浅。现在把孙哥视频分享给大家。 孙哥链接:孙哥个人主页 作者简介:一个颜值99分,只比孙哥差一点的程序员 本专栏简介:话不多说,让我们一起干翻J…

大神链接:作者有幸结识技术大神孙哥为好友,获益匪浅。现在把孙哥视频分享给大家。

孙哥链接:孙哥个人主页
作者简介:一个颜值99分,只比孙哥差一点的程序员
本专栏简介:话不多说,让我们一起干翻JVM

本文章简介:话不多说,让我们讲清楚JVM当中与操作数栈相关的字节码指令

文章目录

一: 操作数栈字节码指令

1:编写源码

2:javap解释整理字节码

3:通过jclasslib查看字节码指令

二:字节码分析

1:最全字节码指令分析

2:面试题


一: 操作数栈字节码指令

1:编写源码

public class OperandStackTest {public void testAndOperation(){byte i = 15;int j = 8;int k = i+j;}
}

2:javap解释整理字节码

        想要查看字节码文件呢,我们有两种方式,第一种就是直接进行javap,第二种就是使用jclasslib进行查看,我们先使用第一种。

PS D:\code\study\hadoop\shit\target\classes> javap -verbose .\OperandStackTest.class
Classfile /D:/code/study/hadoop/shit/target/classes/OperandStackTest.classLast modified 2023年11月9日; size 421 bytesSHA-256 checksum 487149a1edc4d19af0b1fe2369086c27c8765ff5e011491d1028d4f6cf1d9746Compiled from "OperandStackTest.java"
public class OperandStackTestminor version: 0major version: 52flags: (0x0021) ACC_PUBLIC, ACC_SUPERthis_class: #2                          // OperandStackTestsuper_class: #3                         // java/lang/Objectinterfaces: 0, fields: 0, methods: 2, attributes: 1
Constant pool:#1 = Methodref          #3.#19         // java/lang/Object."<init>":()V#2 = Class              #20            // OperandStackTest#3 = Class              #21            // java/lang/Object#4 = Utf8               <init>#5 = Utf8               ()V#6 = Utf8               Code#7 = Utf8               LineNumberTable#8 = Utf8               LocalVariableTable#9 = Utf8               this#10 = Utf8               LOperandStackTest;#11 = Utf8               testAndOperation#12 = Utf8               i#13 = Utf8               B#14 = Utf8               j#15 = Utf8               I#16 = Utf8               k#17 = Utf8               SourceFile#18 = Utf8               OperandStackTest.java#19 = NameAndType        #4:#5          // "<init>":()V#20 = Utf8               OperandStackTest#21 = Utf8               java/lang/Object
{public OperandStackTest();descriptor: ()Vflags: (0x0001) ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":()V4: returnLineNumberTable:line 1: 0LocalVariableTable:Start  Length  Slot  Name   Signature0       5     0  this   LOperandStackTest;public void testAndOperation();descriptor: ()Vflags: (0x0001) ACC_PUBLICCode:stack=2, locals=4, args_size=10: bipush        152: istore_13: bipush        85: istore_26: iload_17: iload_28: iadd9: istore_310: returnLineNumberTable:line 3: 0line 4: 3line 5: 6line 6: 10LocalVariableTable:Start  Length  Slot  Name   Signature0      11     0  this   LOperandStackTest;3       8     1     i   B6       5     2     j   I10       1     3     k   I
}
SourceFile: "OperandStackTest.java"

3:通过jclasslib查看字节码指令

        首先进行recompile Java文件为字节码文件,然后我们在idea的view下找到这个:

        show ByteCode with JclassLib:

        最终显示结果如下:

二:字节码分析

1:最全字节码指令分析

public class OperandStackTest {public void testAndOperation(){byte i = 15;int j = 8;int k = i+j;}
}
 0 bipush 152 istore_13 bipush 85 istore_26 iload_17 iload_28 iadd9 istore_3
10 return

         bipush将15这个值push到了操作数栈中,此时我们的操作数栈就有了第一个值。我们需要回顾一下:byte、short、char、boolean、int类型在声明之后往数组中进行存放的时候都会保存为int类型。也就是说虽然定义的是byte类型,但是存放到数组中就是int类型

        栈帧在调用之初,栈帧被创建完成,其中的操作数栈和局部变量表是空的。PC寄存器中存放着第一条要执行的指令的地址。

        istore_1将这个值从操作数栈放到了局部变量表中索引为1的位置,为什么不是0呢?因为这不是一个静态方法,索引为零的位置存放的是this。

        此时的操作数栈就成了空,这是一个出栈的操作。过程中会修改PC寄存器中的索引值为下一条命令的索引值。

       过程中会修改PC寄存器中的索引值为下一条命令的索引值。

       同样的道理,8也会经过bipush和istore_2,然后最终的结果如下:

        iload_1和iload_2命令会将变量中索引为1,2的数据取出来分别放到局部变量表中

        最终的运行结果如下:

        紧接着会进行一个iadd命令,这个命令呢会使数据进行出栈,然后相加。值得注意的是,字节码指令需要被翻译为机器指令,机器指令操作CPU进行相加。然后将结果23放到操作数栈当中。

        运行结果如下:

        

        最终,istore_3将这个值从操作数栈放到了局部变量表中索引为3的位置, 此时的操作数栈就成了空,这是一个出栈的操作。过程中会修改PC寄存器中的索引值为下一条命令的索引值。

        最终的运行结果如下:

        我们也注意到,局部变量表长度为4,操作数栈深度为2(看javap的结果),这也是与图中可以对应上的,唯一区别的是局部变量表中的因为篇幅原因,this的位置也就是索引为0的变量槽没有展示出来。 

        补充说明:

        我们注意到bipush是将一个byte类型的数据push到操作数栈中基于int类型进行存储,还有sipush,这个字节码指令的含义是将short类型的数据push到操作数栈中基于int类型进行存储。

        如果方法有返回值,那么最终的字节码指令将由return会变成ireturn。也就是将值做了一个返回,这个栈帧就结束了,另外一个调用此方法的栈帧会立即调用一个aload_x这样的一个操作,将上一个方法的返回值加载到此栈帧的操作数栈中。

    public int getSum(){int m = 10;int n = 20;int k = m+n;return k;}public void testGetSum(){//aload_0获取上一个栈帧返回的结果,并保存在操作数栈中。int i = getSum();int j = 10;}

2:面试题

        i++ 和 ++j的区别是什么?

       此问题,后续我们在字节码文章中会跟大家进行探讨

http://www.hkea.cn/news/281074/

相关文章:

  • 大连做网站仟亿科技最新域名查询
  • 网站开发实施计划与安排宁波网络推广方式
  • 企业网站建设公司注意哪些问题软件开发外包公司
  • abc网站建设怎么样yandex引擎搜索入口
  • wordpress屏蔽f12广州seo网络优化公司
  • 南宁网站建设推广服务云服务器免费
  • 大数据营销是什么seo站长
  • 建设政府网站的公司乐山网站seo
  • 仿站容易还是建站容易专业做灰色关键词排名
  • 做网站背景音乐管理课程培训
  • 网站建设可以自学吗品牌软文范文
  • 网站风格对比哪里有学计算机培训班
  • 做mla的网站网站优化哪家好
  • 网站注册的账号怎么注销线上营销活动有哪些
  • 国内做进口的电商网站网站推广软件哪个好
  • 谁有做那事的网站百度投诉中心入口
  • 免费单页网站在线制作沈阳seo排名优化教程
  • 廊坊网站建大型网站建站公司
  • 远程桌面做网站sem和seo区别与联系
  • 做贷款网站优化大师有用吗
  • 有没有便宜的网站制作制作网页教程
  • 医院网站制作优化关键词的方法有哪些
  • wordpress安装到网站吗泰安seo
  • 长春网站开发培训价格google play三件套
  • 做生存分析的网站有哪些国外新闻最新消息
  • 济南网站优化收费百度互联网营销
  • bootstrap响应网站模板下载发帖推广百度首页
  • 动态网站上的查询怎么做新媒体运营培训学校
  • 网站开发人员必备技能百度优化推广
  • 花都 网站建设百度推广怎么添加关键词