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

javap & jclasslib

魔数、Class 文件的版本和常量池
Class文件结构及深入字节码指令

字节码指令——异常处理
Class文件结构及深入字节码指令
Class文件结构及深入字节码指令

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

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

字节码指令——装箱拆箱
Class文件结构及深入字节码指令
通过观察字节码,我们发现:
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.