1.JVM运行流程,JVM基本结构
JVM基本结构
类加载器,执行引擎,运行时数据区,本地接口
class Flies ->ClassLoader->运行时数据区->执行引擎,本地库接口->本地方法库
类的装载;
加载,连接(验证,准备,解析),初始化,(实例化)使用(对象),卸载
加载:取得类的二进制的字节流,把字节流中的一些静态存储结构转化为数据区,(静态存储结构)放在方法区
加载后产生一个类的类对象,保存一个类的定义(结构),类对象放在堆中。
初始化:执行类的构造器(CLINIT)为类的静态变量赋予正确的初始值
类的构造器:
1.static变量
2.static{}语句
构造方法:实例化对象
2.类加载器双亲委派模型讲解
ClassLoader试图加载类的时候,必须先把任务委托给父类加载器加载,如果父类加载器没有加载这个类的时候。,
如果父类没有加载的话就会反过来给发起者。由发起者自己本身来加载这个类,如果自己本身也没有加载的话
就会报一个classnotfondexception的异常。
问题1:为什么要用双亲委派模型?
主要是为了避免类的重复加载,当父类已经加载了子类就不要加载了。
问题2:ClassLoader有哪几种?
BootStrap ClassLoader 启动类加载器 ---》 rt.jar
要执行Java程序 jvm自己先启动,就要一个启动器 就是BootStrap ClassLoader
Extension ClassLoader 扩展类加载器 -->%JAVA_HOME%/LIB/ext/*.jar 父类是启动类加载器
App ClassLoader 系统类加载器 -->Classpath 父类是扩展类加载器
这些类加载器都会继承ClassLoader
自定义类加载器必须继承ClassLoader -->完全自定义加载路径 父类是系统类加载器
3.ClassLoader源码分析
3.1. 先传入类的路径,一个二进制的名称
3.2.先判断是不是已经加载了,如果已经加载就返回。如果没有加载就从他的父亲去加载
3.3.如果父亲没有加载到是个null,就在自定义的类加载器中加载,如果findClass都没有找到的话就会抛出一个异常
4.从源码分析实现自定义类加载器
没写