×
新网 > 虚拟主机 > 正文

虚拟机类加载

  • 作者:新网
  • 来源:新网
  • 浏览:100
  • 2018-05-15 14:27:40

什么叫做类加载?虚拟机需要把类的数据从Class文件加载到内存中,并对数据进行校验,转换解析初始化。最终成为虚拟机认识的java类型的过程就叫做类加载。

   什么叫做类加载?虚拟机需要把类的数据从Class文件加载到内存中,并对数据进行校验,转换解析初始化。最终成为虚拟机认识的java类型的过程就叫做类加载。

2-160Q0111130B2.jpg

<div>  类加载生命周期:类加载到虚拟机中到最后卸载:加载-验证-准备-解析-初始化-使用-卸载七个阶段。
  加载是类加载的第一个阶段,虚拟机需要完成三件事。
  1:通过类的全路径获取获取定义此类的二进制流。
  2:把这个字节流的静态存储结构转换为方法区的运行运行时数据结构。
  3:在内存中生成一个代表这个类的java.lang.Class对象。作为方法区访问这个类数据结构的入口
  由于规范并没有严格的要求所以实现的方式就更加灵活了。我们可以通过jar,ear,war包等格式中获取也可以通过JSP生成class文件、反射等。
  验证:就是字面意思验证class文件是否是安全的。
  1、文件格式的验证:是否魔数开头,是否包含版本信息。当前虚拟机是否支持当前版本。常量池中的数据是否存在异常等
  2、元数据验证:主要针对类和类的属性。验证字节码的语义是否正确,是否非法继承等。
  3、字节码验证:主要针对方法内部:,验证语义、逻辑等
  4、符号引用验证:验证符号引用中全路径能否找到对应的类。指定类中是否包含使用的方法、字段。当前调用方法是否允许调用等
  准备阶段:分配类变量内存(方法区),并初始化需要注意当前初始化仅仅为static修饰的变量比如 public static int val = 2;
    将被初始化:需要注意的是初始化的结果是0。但是也并不是任何情况都是变量的初始化。
   解析过程就是上面提过的符号引用转换为直接引用。解析过程中也许会触发新的类加载。
  类的初始化是类加载的最后一步。在准备的阶段变量已经初始化过了系统默认的值,单前阶段则为程序中赋予的值。
  提过虚拟机来看当前阶段执行的为类构造器();它是由编译器自动收集类变量赋值动作和静态语句块中的语句合并产生的。收集的顺序为源文件中出现的顺序。静态语句块只能访问到定义在静态块之前的变量。定义在之后的可以赋值,但是不可以访问。
  它不需要显示的调用父类的构造器。虚拟机会保证在子类之前执行。

免责声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,也不承认相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,请发送邮件至:operations@xinnet.com进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

免费咨询获取折扣

Loading