您好!欢迎来到爱源码

爱源码

热门搜索: 抖音快手短视频下载   

从堆栈框架看字节码在JVM中的流动 《电影网站源码》

  • 时间:2022-09-08 01:24 编辑: 来源: 阅读:299
  • 扫一扫,手机访问
摘要:从堆栈框架看字节码在JVM中的流动 《电影网站源码》
从堆栈框架中,我们可以看到字节码在jvm中是如何流动的。我们都知道java文件需要编译成类文件,然后JVM负责加载运行类文件。那么字节码文件是什么样子的呢?字节码是如何执行的?工具细节javapjavap是一个用于查看JDK附带的字节码的工具。 javap的用法如下:$ javacdemo.java $ javap-p-vdemojavap命令有时候打印的文件太多,可以用javap-p-vde mo >;& gtDemo.javap将内容附加到文本文件中,然后用文本工具打开分析。 有时,LineNumberTable或LocalVariableTable不会在类文件中生成。可以使用以下参数在编译时强制生成line number table:javac-g:lines Javac -g:vars强制生成LocalVariableTable。 Java-G生成所有的调试信息。 LocalVariableTable是堆栈框架中的局部变量表。 LineNumberTable描述了源代码行号和字节码行号之间的对应关系(字节码偏移量)。有了这些信息,调试时就可以得到异常的源代码行号。 Jclasslib如果不习惯命令行操作,也可以使用jclasslib,这是一个图形化的工具,可以更直观的查看字节码的内容。 还把班级各个部分分门别类的整理出来,非常人性化。 同时还提供了Idea的插件,你可以从插件中搜索。 如果在里面看不到LocalVariableTable等少量信息,记得在编译代码的时候添加上面提到的这些参数。 Jclasslib下载地址:ingokegel/jclasslibDemo.java以下java代码是后面要分析的字节码对应的源文件:public class demo { private int a = 1111;静态长C = 2222public long test(long num){ long ret = this . a+num+C;返回ret} public static void main(String[]args){ new Demo()。测试(3333);}}测试方法代码区细节测试方法的执行过程同时使用成员变量A、静态变量C、输入参数num。 当我们所说的方法被执行时,内存实际上是在虚拟机堆栈上分配的。 下面的内容是测试方法的字节码。 公长考(long);描述符:(J)J flags:ACC _ PUBLIC Code:stack=4,locals=5,args _ size = 2 0:aload _ 0 1:get Field # 2//Field a:I 4:i2l 5:lload _ 1 6:ladd 7:get static # 3//C:J 10:ladd 11:l store _ 3 12:l load _ 3 13:l返回行号表:line 7: 0 line 8: 12描述:stack = 4:表示测试方法的最大操作数堆栈深度为4。 在运行时,JVM会根据这个值在栈帧中分配操作栈的深度。 Locals=5:局部变量的存储空间,它的单位是Slot,可以重用。 存储的内容包括:this、方法参数、异常求解器的参数和方法体中定义的局部变量。 Arg _ size = 2:方法的参数个数。由于每个实例方法都有一个隐藏参数this(静态方法没有这个),所以这里的数字是2。 代码执行过程0: aload_0将第一个引用局部变量推送到操作数堆栈,这意味着这个被加载到操作数堆栈中。 对于静态方法,aload_0表示对该方法的第一个参数的操作。 Image.png1: getField #2将指定对象的第二个实例字段的值推到堆栈顶部。 #2引用我们的成员变量a。 Image.png4: i2l将栈顶int类型的数据转换为long类型,这就涉及到我们的隐式类型转换。 Image.png5: lload_1将第一个局部变量放入堆栈,这是我们的参数num,其中l代表long。 Image.png6: ladd将堆栈顶部的两个长值相加,并将结果放入堆栈。 Image.png7: getstatic #3根据偏移量获取静态属性的值,并将该值推送到操作数堆栈,即静态变量c。 Image.png10: ladd再次执行ladd。 Image.png11: lstore_3在第四个局部变量中存储栈顶的long值,一个long和double类型会占用两个slot。 这里,为什么image.png把栈顶的变量存储在局部变量表中,然后把它们取出放入栈中?为什么会有这种不必要的操作?原因是我们定义了ret变量。 不知道JVM以后会不会用这个变量,只好傻乎乎的按顺序执行。 为了看出区别,我们可以稍微修改一下代码,直接返回:public long test(long num){ return this . a+num+c;}对应的字节码如下:public long test(long);描述符:(J)J flags:ACC _ PUBLIC Code:stack = 4,locals=3,args _ size = 2 0:aload _ 0 1:get Field # 2//Field a:I 4:i2l 5:lload _ 1 6:ladd 7:get static # 3//C:J 10:ladd 11:l返回行号表:line 7: 012: l load _ 3 *将第三个局部变量放入堆栈,这是我们的参数num,其中l代表long。 Image.png13: lreturn从当前方法返回一个长整型值。 更多精彩内容关注微信官方账号:慕容于谦参考链接:https://blog.csdn.net/u022812849/article/details/107411679


  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【技术支持|常见问题】1556原创ng8文章搜索页面不齐(2024-05-01 14:43)
【技术支持|常见问题】1502企业站群-多域名跳转-多模板切换(2024-04-09 12:19)
【技术支持|常见问题】1126完美滑屏版视频只能显示10个(2024-03-29 13:37)
【技术支持|常见问题】响应式自适应代码(2024-03-24 14:23)
【技术支持|常见问题】1126完美滑屏版百度未授权使用地图api怎么办(2024-03-15 07:21)
【技术支持|常见问题】如何集成阿里通信短信接口(2024-02-19 21:48)
【技术支持|常见问题】算命网微信支付宝产品名称年份在哪修改?风水姻缘合婚配对_公司起名占卜八字算命算财运查吉凶源码(2024-01-07 12:27)
【域名/主机/服务器|】帝国CMS安装(2023-08-20 11:31)
【技术支持|常见问题】通过HTTPs测试Mozilla DNS {免费源码}(2022-11-04 10:37)
【技术支持|常见问题】别告诉我你没看过邰方这两则有思想的创意广告! (2022-11-04 10:37)

联系我们
Q Q:375457086
Q Q:526665408
电话:0755-84666665
微信:15999668636
联系客服
企业客服1 企业客服2 联系客服
86-755-84666665
手机版
手机版
扫一扫进手机版
返回顶部