JVM-类加载器
尚硅谷学习视频
JVM实现跨平台,运行字节码文件
一次编译导出运行,自动内存管理,不需要程序员手动进行内存管理
JVM与操作系统打交道,不和计算机硬件交互
1、类加载器
类加载器是负责将编译后的class文件加载,给执行引擎执行,临时存放的区域就是运行时内存区域
类加载器由4种组成
- 启动类加载器(Bootstrap ClassLoader)
由C++语言编写,用于加载核心类库(JAVA_HOME/jre/lib),不继承ClaassLoader类
- 扩展类加载器(Extension ClassLoader)
派生于ClassLoader类
,加载jtr/lib/ext子目录下的内容 - 应用程序类加载器( AppClassLoader)
Java语言编写,派生于classloader类,加载classpath的路径
该类加载器是程序中默认的类加载
可以通过ClassLoder.getSystemClassLoader()来获得加载器 - 用户自定义类加载器
目的:修改类的加载方式,扩展加载源,防止源码泄露
使用自定义加载器步骤:
继承抽象类 java.lang.ClassLoader,在jdk1.2之前要重写loadClass()方法,jdk1.2之后只要写findClass()方法中
类加载器只负责加载,不管是否可以运行
2、类加载过程
-
加载
通过类的全限制名来获得该类的二进制流
在内存中生存一个java.lang.Class的对象,作为方法区这个类的各种数据的入口 -
连接
-
验证
检测class文件是否符合jvm虚拟机规范(文件格式校验,元数据校验,字节码校验,符号引验证) -
准备
为类变量分配内存空间并初始化为默认值
不包括用final修饰的static变量,final变量的初始化会在编译阶段
不初始化成员变量 -
解析
将常量池中的符号引用转换为直接引用
-
-
初始化
执行类构造器过程 -
使用
-
卸载
3、双亲委派模型
当一个类被加载的时候,自己先不去加载而是交给父类加载器。每一层都是如此,所以就会最终启动加载器加载,如果父类加载器不能加载,子类才会加载
好处:避免类的重复加载,避免核心类库被替换
判断是否是同一个类:
1.类的权限名要相同
2.加载该类的classloader必须相同