java面试常考点之--类加载

java面试常考点之–类加载

字节码中的指令

通过javap -c ClassName指令反编译class字节码,查看字节码指令和执行顺序。
简单分析指令
a
图中是learn方法的反编译指令和解释,其中#3 #4是符号引用,对应的值(字面量)保存在常量池中。(上篇文章简单分析了常量池,在此不做讨论)

字节码指令分类
  1. 加载存储指令 iload_0 将第一个int变量推到栈顶 fstore_1 将float存入指定本地变量
  2. 运算指令 iadd : int型相加
  3. 类型转换指令 i2f : int转float
  4. 对象操作指令 new 创建类的实例 getfield 访问类字段
  5. 操作数栈管理指令 dup 复制并压栈 pop 弹出栈顶
  6. 控制转移指令 ifne 判断跳转指令
  7. 方法调用返回指令 ireturn 返回int invokestatic 调用静态方法
  8. 异常处理指令 athrow 栈顶异常抛出
  9. 同步指令 monitorenter 获取监视器对象 monitorexit 释放对象锁
jvm内存模型

jvm内存模型没啥说的,面试题中的桑塔纳87吧。直接上图。
jvm内存模型

public long add();
    Code:
       0: bipush        12          //把12载入操作数栈
       2: istore_1                  //存入变量表1中
       3: bipush        10          //把10载入操作数栈
       5: istore_2                  //存入变量表2中
       6: iload_2                   //把本地变量2推入栈顶
       7: iload_1                   //把本地变量1推入栈顶
       8: iadd                      //将栈顶两int变量相加,压入栈顶
       9: istore_3                  //把栈顶元素存入变量表3
      10: iload_3                   //把本地变量2载入栈顶
      11: i2l                       //把int转化long型并压入栈顶
      12: lreturn                   //返回栈顶元素

到这里add方法就简单分析完了。

类加载
何时类加载
  1. 对象实例化
  2. 类方法static method和属性被调用
  3. Class.forName()

注: 静态字面量常量被类调用时,不会引起类加载。

类加载机制
  1. 加载 classload
  2. 验证 jvm规范校验 逻辑校验
  3. 准备 方法区分配内存空间
  4. 解析 符号引用替换为直接引用
  5. 初始化 静态变量赋值
对象实例化
class  Student{
	public  int vi= 10;
	public static int cnt = 1;
	public Student(){
	}
}

以上面代码为例进行分析。

new Student() jvm 会检查Student.class是否已经被加载,如果没有被加载先加载类;类被载入方法区。初始化类,把类属性合并到静态代码块中,执行静态代码块初始化完成。最后把实例变量合并到构造方法中,调用构造方法实例化类。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值