jvm的类加载过程
- 加载
- 通过一个类的全限定名获取定义此类的二进制字节流
- 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
- 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口
- 链接
- 验证
- 验证内容的合法性
- 准备
- 把方法区的静态变量初始化为默认值(零值)
- 会为final修饰的常量初始化(正确的值)。
- 解析
- 将编译后文件的符号引用转为直接引用
- 验证
- 初始化
- 执行类构造器方法<clinit>()的过程
- 此方法不需要定义,是javac编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并起来。如果没有前述内容,则没有clinit方法
- 构造器方法中指令按照语句在源文件中出现的顺序执行
- 若该类具有父类,JVM会保证子类的<clinit>()方法执行前,父类的<clinit>()已经执行完毕
- 虚拟机必须保证一个类的<clinit>()方法在多线程下被同步加锁