2020年6月24日 作者 zeroheart

类加载过程

分为三个步骤,装载、链接、初始化,其中链接分为(验证、准备、解析)

装载,就是拿到class,不管这个class是从文件,还是流,还是其他的地方过来。

验证,是验证class的格式,准备是做些静态变量分配内存,并初始化为当前类型的默认值,比如static int,默认就会赋值为0

解析就是把类的符号引用转化为直接引用,就是在内存中的地址对应起来。

初始化,是给类变量(静态变量)赋定义的值,执行静态代码块(静态代码块只能访问定义在静态代码块之前的静态变量,定义在静态代码块之后的静态变量,可以赋值,但是不能访问)

classLoader:从上到下分别是bootstrap(javahome\lib下面的jar)、ext(javahome\lib\ext下面的jar)、app(classpath下面的jar)、cusome几个级别。遵循双亲委派制度,防止重复加载,同时防止系统中有同名的类,造成污染。也可以打破双亲委派,实现方法是自定义加载器,osgi,spi等。不太了解,osgi之前odl是用的,主要是热加载。

bootstrap输出是null,据说是c语言写的看不到,不知道这个解释是不是有问题。

双亲委派的总结:向上委派-加载缓存,向下查找-加载路径

运行时数据区

执行方法就是创建栈帧,入栈,出栈的操作。