文章目录
- 类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在打开头有特定的文件标识
- ClassLoader只负责class文件的加载,至于他是否可以运行,有Execution Engin决定
- 加载的类信息存放于一块成为方法去区的内存空间。除了类信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字字面量
类加载过程:
ClassFile经过类加载器子系统加载成类模板存在于方法区中,然后可以使用改模板去创建n个实例
类变量表有两次初始化的机会,第一次是在"准备阶段",执行系统初始化,对类变量设置灵芝,一次则是在"初始化",赋予长序员在代码中定义的初始值
1、类加载器
分类:
- 引导类加载器(BootStrap Class Loader)
- 扩展类加载器(Extension Class Loader)
- 系统/应用类加载器(System Class Loader)
- 自定义加载器
1.1 双亲委派机制
- 如果一个类加载器收到了加载类的请求,他不会自己先去加载,而是把这个请求委托给父类加载器去执行
- 如果父类加载器还存在父类加载器,则进一步向上委托,依次递归,请求最终达到顶层的启动类加载器
- 如果父类加载器可以完成类的加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式
优势:
- 避免类的重复加载
- 保护程序安全,防止核心API被随意篡改
- 自定义类:java.lang.String
自定义string类,但是在加载自定义string类的时候会率先使用引导类加载器加载,而引导类加载器在加载的过程中会先加载jdk自带的文件(rt.jar包中java\lang\string.class),报错信息说没有main方法,就是因为加载的是rt.jar包中的string类。这样可以保证对java核心源代码的保护,这就是沙箱安全机制。
JVM必须知道一个类型是由启动加载器加载的还是由用户类加载器加载的。如果一个类型是由用户类加载器加载的,那么JVM会将这个类加载器的一个引用作为类型信息的一部分保存在方法区中。当解析一个类型到另一个类型的引用的时候,JVM需要保证这两个类型的类加载器是相同的。