一、类加载过程: 加载(loading) -> 链接(linking) -> 初始化(initialization)
其中链接又分为三个小部分:验证(verification) -> 准备(preparation) -> 解析(resolution)
Ⅰ 加载(loading)
将class文件读入内存,并为之创建一个java.lang.Class对象。这一步由类加载器完成,一般由JVM提供,也可以继承ClassLoader实现自己的类加载器。需要注意的是,并不是所有的类都是在使用时才加载,JVM允许某些类预先加载。
Ⅱ 链接(linking)
将二进制类数据合并到JRE(Java Runtime Environment)中。
1. 验证(verification) 验证加载的类是否有正确的内部结构。作用:防止危害虚拟机的安全。主要包括:
- [文件格式验证] 是否符合class文件规范。
- [元数据验证] 分析字节码语义,是否符合java语言规范 。
- [字节码验证] 分析数据流和控制,是否合乎逻辑 。
- [符号引用验证] 确保一定能被引用到(符号引用转化为直接引用时 概念参考)。此过程延续到解析阶段。
2. 准备(preparation) 为静态变量分配内存,设置默认值。
private static int number = 0;
3. 解析(resolution) 现在已经为静态变量分配了内存,那么就需要将这些变量的符号引用替换为直接引用,这就是链接。
Ⅲ 初始化(initialization)
一切准备就绪,现在可以给静态变量赋予正确的初始值。
private static int number = 10;
二、类加载机制
- 全盘负责 类加载器加载某个类时,也同时负责该类引用的其他类的加载,除非有显示的指定类加载器。
- 双亲委派 优先让父类加载class【递归执行】,若父类无法加载再交由子类加载。这种机制可避免子类与父类重复加载。
- 缓存机制 加载过的class将被缓存,不会再次加载。这就导致很多时候修改了代码需要重启jvm。
问题:什么条件下修改了代码或者修改了哪些代码不需要jvm重启?