JVM类加载机制简介

类加载分7个步骤:
1:加载
     1)通过一个类的全限定名来获取此类的二进制字节流
     2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
     3)在Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口

2:验证 
      保证Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全
    1)文件格式验证,如版本号是否对,是否以魔数OxCAFEBABE开头等,经过这个阶段基于字节流进行的验证之后,字节流进入内存的方法去中进行存储,后面的三个验证阶段都是基于方法区的存储结构进行的。
   2)元数据验证,这一阶段是语义分析阶段,如是否有父类(除Object外都应该有父类),是否继承了不允许被继承的类。
   3)字节码验证,这一阶段是对方法体进行验证,主要是进行数据流和控制流的分析。如保证跳转指令不会跳转到方法体以外的字节码指令上。
   4)符号验证,将符号引用转化为直接引用
    如果所运行的代码已经被验证过,在实施阶段可以使用-Xvefiry:none参数来关闭大多数的类验证措施,以缩短虚拟机类加载的时间。
3:准备
    为类变量分配内存并设置类变量的初始值(即默认值),但不包括实例变量,常量的话会直接赋值他原来的值,不会是赋值默认值。
4:解析,
     将常量池类的符号引用替换为直接引用
     解析可能会在初始化之后,这是为了java的动态绑定。
5:初始化,执行所有的类变量赋值和静态语句块的执行。
6:使用
7:卸载
    只有当加载该类的类加载器实例变为unreachable状态时,当前类才会被卸载。


另:
(1)类加载器已经在Tomcat理解的比较透彻,这里就不贴了
(2)通过子类来引用父类中定义的静态字段,只会触发父类的初始化而不会触发子类的初始化。如SubClass.value中如果value是在父类中定义的静态字段,则这样调用只会初始化父类。
(3)但一个类在初始化时,要求其父类都已经初始化了,但是对接口没有这个要求。
(4)一个类A有另一个类B的常量的引用,在编译阶段已经将类B的常量转换为对A类自身常量池的引用了。所以在A类的class文件之中并没有B类的符号引用入口。

参考  :
《深入理解java虚拟机》周志明
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值