一:类加载运行全过程
当我们用 java 命令运行某个类的启动函数时,首先需要类加载器把主类加载到
JVM 中。
整个加载过程中有一步:
classLoader.loadClass(“某类”)。
这个 loadClass 的类加载过程有如下几步:
加载 >> 验证 >> 解析 >> 初始化 >> 使用 >> 卸载
1:加载-在硬盘中查找并 io 读入字节码文件(注意:使用到类的时候才会去加
载,例如 new 对象,调用 main 方法等),此时会在内存中生成一个代表此类的
Class 对象,作为方法区此类各种数据的入口。
2: 验证-校验字节码文件是否正确
3: 准备-静态变量分配内存,并赋默认值
4: 解析-静态链接的过程(符号引用替换为直接引用)
5: 初始化-静态变量初始化为指定值,执行静态代码块
5 步走完之后,类加载到方法区,主要包含的信息有:
1:运行时常量池
2:类型信息
3:字段信息
4:方法信息
5:类加载器的引用--类到类加载器实例的引用
6:对于 clss 实例的引用-加载的类信息在方法区中,此时会创建一个对应的
Class 对象实例放到 堆 中 ,作为 开发人员访问类定义的入口和切入点
注:主类中如果有使用其它类,会逐步加载这些类。jar(war)包 中的类不会
一次性全部加载,使用到时才会去加载
以上是类加载的基本过程,那这个过程是通过谁去做的呢?
类加载器和双亲委派机制
类加载过程主要是通过类加载器去实现的,java 中有如下几种 类加载器:
1:引导类加载器--负责加载支撑 JVM 运行的核心类库,JRE 的 lib 目录下的,
比如 rt.jar
2:扩展类加载器--负责加载支撑 JVM 运行的核心类库,JRE 的 lib 目录下的
ext 目录下的 jar 包
3:应用程序类加载器--辅助加载 ClassPath 路径下的类包,主要加载的就是
程序员自己写的那些类
评论0