简介:

类加载机制:

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

      JVM把class文件加载到内存,并对数据进行校验,解析和初始化,最终形成JVM可以直接使用的Java类型的过程。

类加载全过程:

  加载:

       将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问路口,这个过程需要类加载器参与。

  链接:  将Java类的二进制代码合并到JVM的运行状态之中的过程。

  (1)验证:确保加载的类信息符合JVM规范,没有安全方面的问题。

  (2)准备:正式为类变量(static变量)分配内存并设置变量初始值的阶段,这些内存都将在方法区中进行分配。

  (3)解析:虚拟机中常量池的符号引用替换为直接引用的过程。

 初始化:

    初始化阶段是执行类构造器方法的过程,类构造器方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块中的语句合成的。

    当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先出发其父类的初始化。

    虚拟机会保证一个类的方法在多线程环境中被正确加锁和同步。

    当访问一个Java类的静态域时,只有真正声明这个域的类才会被初始化。

类加载器的层次结构(树状结构):

(1)引导类加载器:用来加载Java的核心库,是由原生代码来实现的,并不继承自java.lang.ClassLoader,加载扩展类和应用程序类加载器,并指定它们的父类加载器。

(2)扩展类加载器:用来加载Java的扩展库,Java虚拟机的实现会提供一个扩展库目录,该类加载器在此目录里面查找并加载Java类。由sun.misc.Launcher$ExtClassLoader实现。

(3)应用程序类加载器:根据Java应用的类路径(classpath,java.class.path)路类实现,一般来说,Java应用的类都是由它来完成加载的。由sun.misc.Launcher$AppClassLoader实现。

(4)自定义类加载器:开发人员通过继承java.lang.ClassLoader类的方式实现自己的类加载器,以满足一些特殊的需求。

Java.lang.ClassLoader类的相关介绍:

作用:

(1)根据一个指定的类的名称,找到或者生成对应的字节代码,然后从这些字节代码中定义出一个java类,即java.lang.Class类的一个实例。

(2)负责加载Java应用所需的资源,如图像文件或配置文件等等。

相关方法:

  •   getParent():返回该类加载器的父类加载器。
  •   loadClass(String name):加载名为name的类,返回的结果是java.lang.Class类的一个实例。
  •   findClass(String name):查找名为name的类,返回的结果是java.lang.Class类的一个实例。
  •   findLoadedClass(String name):查找名称为name的已经被加载的类,返回的结果是java.lang.Class类的一个实例。
  •   defineClass(String name,byte[] b,int off,int len):将字节数组中b的内容转换成java类,返回的结果为java.lang.Class类的实例,方法为final。
  •   resolveClass(Class<?> c):链接指定的java类。

Ps:对于以上给出的方法,表示类名称的name参数的值为类的二进制名称。

类加载全过程图示:

java-初识JVM运行及类加载过程 随笔 第1张

简单分析类加载器作用:

java-初识JVM运行及类加载过程 随笔 第2张

内存分析:

java-初识JVM运行及类加载过程 随笔 第3张

 ps:文章待完善,内容后续补全。

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄