java字节码画图_JVM-绘图展现字节码执行引擎执行过程

在我的上一篇博客JVM-String比较-字节码分析中介绍了String字符串比较的原因,借着分析字节码的机会,我这篇博客将会绘图展现方法内部字节码执行过程。

话不多说,贴上我们将要分析的Java方法代码:

public static voidbb(){

String s1="a"+"b";

String s2= "ab";

p(s1==s2);//true

}

再贴上我们将要分析的Java方法的字节码:

public static voidbb();

flags: ACC_PUBLIC, ACC_STATIC

Code:

stack=2, locals=2, args_size=0

0: ldc #5 //String ab 将字符串"ab"从常量池中推送至栈顶

2: astore_0 将栈顶引用类型(字符串"ab")存入第一个本地变量3: ldc #5 //String ab 将字符串"ab"从常量池中推送至栈顶

5: astore_1 将栈顶引用类型(字符串"ab")存入第一个本地变量6: aload_0 将第一个本地变量("ab")推送至栈顶7: aload_1 将第二个本地变量("ab")推送至栈顶8: if_acmpne 15比较栈顶两引用类型数值,结果不同跳转(这里当然相同啦)11: iconst_1 将int类型 1推送至栈顶12: goto 16无条件跳转到16字节码偏移量15: iconst_016: invokestatic #10 //Method java/lang/Boolean.valueO 调用静态方法Boolean.valueOf();并将返回的Boolean类型的true压入栈顶

f:(Z)Ljava/lang/Boolean;19: invokestatic #11 //Method p:(Ljava/lang/Object;)V 调用静态方法p(true);输出true

22: return 从当前方法返回void

由Code:下面的第一行,我们得知,操作数栈深度为2,局部变量空间为2个Slot,参数个数为0。

如果你把所有的图片复制下来,会看到动态般执行的效果。

-------------------------------------------------------------------绘图分割线----------------------------------------------------------

c91c671510d1b7863b63bc1ad80f61db.png   

88197389a6671b74901b0b4eeab95e26.png   

1d012897c45356cff25c74c4fa18350a.png

63ab73568cd48dd8dff6cacf72d71746.png   

1330822d560420beb0bc974e86b1ebdc.png  

2a6b15e3b3e29a73532fec5dc81d7b47.png

cb11c496985ca970e4703d16d7a39d02.png  

d33e4e5578a24a90d7187b82bc711a0a.png 

499f739bef7a9fa482ea63f08472cfb6.png

ede7e098eb6387a90c3d45913b882520.png 

4f20a7594640c4f40d48317dc5353f4a.png  

356e40aea79846657e522e853b4e8760.png

如果有不对的地方,欢迎指正。

如果你认同我的博文,帮忙推荐一下,博主写这篇博客不易。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值