0%

JVM二---类加载器

1.类加载子系统

​ 如果要手写一个java虚拟机,主要考虑两部分:类加载系统和执行引擎。

​ 类加载系统:加载.class文件

​ 执行引擎:逐条解释执行指令

内存结构概述:

作用:

这个里特定的文件标识是coffee baby 魔术

虚拟机借助魔数,用来识别.class 文件,虚拟机在加载类文件之前会先检查魔数,如果不是 0xCAFEBABE 则拒绝加载该文件。

运行时常量池,是Class文件中的常量池:Class文件中的常量,加载到内存里面,就变成了运行时常量池

类的加载过程

类的加载过程:加载、链接(验证、准备、解析)、初始化

加载、链接、初始化

1.加载

生成大的class对象是在加载的过程中实现的

2.链接

3.初始化

1
2
3
4
5
6
7
8
9
10
11
12
package com;

public class test {
private static int num = 1;

public test() {
}

public static void main(String[] args) {
System.out.println(num);
}
}

这里需要注意的是,clinit方法,不是我们定义的,而是jvm自己定义的方法

如果程序里没有类变量或者静态代码块,就不会有clinit方法

虚拟机必须保证一个类的clinit方法在多线程下被同步加锁

因为,类的类型信息在jdk8之后是存放在元空间(本地直接内存中),一个类只能被加载一次,所以一个线程在clinit的时候,别的线程是不能clinit这个类的,也就是同步加锁

2.类加载器

简要介绍

ext扩展类加载器获取它的上层,Bootstrap加载器,获取不到,结果为null

启动类加载器

扩展类加载器

系统类加载器

为什么要有用户自定义类加载器

关于ClassLoader

3.双亲委派机制

看包名,是否归某一类加载器管辖

优势

沙箱安全机制

4.其他

类的主动使用和被动使用

一个类型到另一个类型,这里在后面的动态链接的部分会有所提及,所以我们需要知道这个信息

类的主动使用和被动使用的区别:会不会导致类的初始化,主动使用回导致类的初始化

5.小总结(类加载子系统)