1. jvm何时会加载一个类
我们先来看这个问题,JVM何时会加载我们的类,那就是类被使用,即有main方法的类一定要先加载,其次就是main方法中的调用其他类也是会被加载到内存中的
为了更详细理解这个过程我们来看这段代码的加载过程:
public class Zou {
public static void main(String[] args) {
Student student = new Student();
}
}
2. 如何加载
在明白了有那些类会先被加载到JVM中,我们就来考虑这个问题,类如何加载到JVM
这里就要说道类加载机制了,一个类被加载是有四个步骤的
- 验证:验证class是否正确,符合编译
- 准备:给类分配内存空间,类变量(也就是static修饰的变量)分配内存空间,来一个默认的初始值
- 解析:把符号引用替换为直接引用
- 初始化:
可通过下图来理解:
类加载器
实现上面的类加载实际是需要靠类加载器来完成的,一般的类加载器有:
- Bootstrap ClassLoader
启动类加载器,他主要是负责加载我们在机器上安装的Java目录下的核心类的
即jre/lib目录下的jar - Extension ClassLoader
扩展类加载器,加载jre/lib/ext 下的 jar - Application ClassLoader
应用程序类加载器, 加载“ClassPath”环境变量所指定的路径中的类,也可以理解为加载我们自己写好的Java代码 - 自定义类加载器
我们自己根据自己需求定制类加载器
类加载机制
jvm的类加载机制采用双亲委派机制
什么是双亲委派机制?
就是假设你的应用程序类加载器需要加载一个类,他首先会委派给自己的父类加载器去加载,他的父类又找他自己的父类,最终传导到顶层的类加载器去加载
从顶层的的类加载器没有找到,那么就会下推加载权利给自己的子类加载器,依此如此
像上图那样