Class文件结构及深入字节码指令

javap & jclasslib

魔数、Class 文件的版本和常量池
在这里插入图片描述

字节码指令——异常处理
在这里插入图片描述
在这里插入图片描述

在 synchronized 生成的字节码中,其实包含两条 monitorexit 指令,是为了保证所有的异常条件,都能够退出。可以看到,编译后的字节码,带有一个叫 Exception table 的异常表,里面的每一行数据,都是一个异常处理器:

  1. from 指定字节码索引的开始位置
  2. to 指定字节码索引的结束位置
  3. target 异常处理的起始位置
  4. type 异常类型
    也就是说,只要在 from 和 to 之间发生了异常,就会跳转到 target 所指定的位置。我可以看到,第一条 monitorexit(16)在异常表第一条的范围中,如果异常,能够跳转到第 20 行;第二条 monitorexit(22)在异常表第二条的范围中,如果异常,能够跳转到第 20 行

字节码指令——装箱拆箱
在这里插入图片描述
通过观察字节码,我们发现:
1、在进行乘法运算的时候,调用了 Integer.intValue 方法来获取基本类型的值。
2、赋值操作使用的是 Integer.valueOf 方法。
3、在方法返回的时候,再次使用了 Integer.valueOf 方法对结果进行了包装。

IntegerCache

但这里有一个陷阱问题,我们继续跟踪 Integer.valueOf 方法。这个 IntegerCache,缓存了 low 和 high 之间的 Integer 对象一般情况下,缓存是的-128 到 127 之间的值,但是可以通过 -XX:AutoBoxCacheMax 来修改上限。下面是一道经典的面试题,请考虑一下运行代码后,会输出什么结果?
一般情况下是是 true,false 因为缓存的原因。(在缓存范围内的值,返回的是同一个缓存值,不在的话,每次都是 new 出来的)当我加上 VM 参数 -XX:AutoBoxCacheMax=256 执行时,结果是 true,ture,扩大缓存范围,第二个为 true 原因就在于此。

类加载

链接: link.

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值