类加载子系统
类加载子系统 Class Loader SubSystem
类加载过程
- 加载 Loading:从物理磁盘加载class文件到内存中,将字节流所代表的静态结构转换方法区的运行时数据结构,同时在方法区生成类的Class对象
- 链接 Linking
- 验证 Verify:验证class的文件的合法性
- 准备 Prepare:为类变量分配内存并初始化零值,这里不包含final修饰的类变量,因为final修饰的类变量在编译时候就会分配,在此阶段会显示初始化
- 解析 Resolve:将常量池的符号引用转换为直接引用,即建立一个指针指向对应的对象。
- 初始化 Initialization: 执行类构造器方法(虚拟机视角下的)
的过程, 是收集所有类变量的赋值过程并顺序执行,clinit在多线程下被同步加锁。
双亲委派机制
JVM对class文件采用的是按需加载的方式,当需要使用该类时才会将它的class文件加载到内存中生成class对象,而加载class文件时采用的就是双亲委派机制,即交由父类加载器先处理,一层一层向上委托到Bootstrap ClassLoader引导类加载器处理,如果属于引导类加载器处理的范围(Java.lang包)则进行类加载,一旦找到就停止继续委托,如果不属于则向下委托直至找到正确的类加载器。
优势:
- 避免类的重复加载
- 保护程序安全,防止核心API被篡改
沙箱安全机制:当我们自定义一个String的类,类加载器最终还是会加载rt.jar包下的String类,从而避免程序受到恶意攻击,保证java核心源代码的保护,这就是沙箱安全机制。
类加载子系统
http://example.com/2022/10/13/Java/JVM/类加载子系统/