1. jvm何时会加载一个类

我们先来看这个问题,JVM何时会加载我们的类,那就是类被使用,即有main方法的类一定要先加载,其次就是main方法中的调用其他类也是会被加载到内存中的

为了更详细理解这个过程我们来看这段代码的加载过程:

public class Zou {

    public static void main(String[] args) {
        Student student = new Student();
    }
}

java SpringStartConfig加载工具类 spring类加载机制jvm_类加载器

2. 如何加载

在明白了有那些类会先被加载到JVM中,我们就来考虑这个问题,类如何加载到JVM

这里就要说道类加载机制了,一个类被加载是有四个步骤的

  1. 验证:验证class是否正确,符合编译
  2. 准备:给类分配内存空间,类变量(也就是static修饰的变量)分配内存空间,来一个默认的初始值
  3. 解析:把符号引用替换为直接引用
  4. 初始化:

可通过下图来理解:

java SpringStartConfig加载工具类 spring类加载机制jvm_类加载机制_02

类加载器

实现上面的类加载实际是需要靠类加载器来完成的,一般的类加载器有:

  1. Bootstrap ClassLoader
    启动类加载器,他主要是负责加载我们在机器上安装的Java目录下的核心类的
    即jre/lib目录下的jar
  2. Extension ClassLoader
    扩展类加载器,加载jre/lib/ext 下的 jar
  3. Application ClassLoader
    应用程序类加载器, 加载“ClassPath”环境变量所指定的路径中的类,也可以理解为加载我们自己写好的Java代码
  4. 自定义类加载器
    我们自己根据自己需求定制类加载器

类加载机制

jvm的类加载机制采用双亲委派机制
什么是双亲委派机制?
就是假设你的应用程序类加载器需要加载一个类,他首先会委派给自己的父类加载器去加载,他的父类又找他自己的父类,最终传导到顶层的类加载器去加载
从顶层的的类加载器没有找到,那么就会下推加载权利给自己的子类加载器,依此如此
像上图那样