程序员看似光鲜的就业前景面前, 逃不过的是层层的面试, 想要进前沿的大公司没有个五六七八面, 是不可能滴! 而找工作的首个关卡就是笔试, 想要获得高薪工作的小伙伴, 先刷一波面试题吧!
类加载过程主要包含加载, 验证, 准备, 解析, 初始化, 使用, 卸载七个方面, 下面一一阐述.
1, 加载
在加载阶段, 虚拟机主要完成三件事:
1. 通过一个类的全限定名来获取定义此类的二进制字节流.
2. 将这个字节流所代表的静态存储结构转化为方法区域的运行时数据结构.
3. 在 Java 堆中生成一个代表这个类的 java.lang.Class 对象, 作为方法区域数据的访问入口
2, 验证
验证阶段作用是保证 Class 文件的字节流包含的信息符合 JVM 规范, 不会给 JVM 造成危害. 如果验证失败, 就会抛出一个 java.lang.VerifyError 异常或其子类异常. 验证过程分为四个阶段
1. 文件格式验证: 验证字节流文件是否符合 Class 文件格式的规范, 并且能被当前虚拟机正确的处理.
2. 元数据验证: 是对字节码描述的信息进行语义分析, 以保证其描述的信息符合 Java 语言的规范.
3. 字节码验证: 主要是进行数据流和控制流的分析, 保证被校验类的方法在运行时不会危害虚拟机.
4. 符号引用验证: 符号引用验证发生在虚拟机将符号引用转化为直接引用的时候, 这个转化动作将在解析阶段中发生.
3, 准备
准备阶段为变量分配内存并设置类变量的初始化. 在这个阶段分配的仅为类的变量 (static 修饰的变量), 而不包括类的实例变量. 对已非 final 的变量, JVM 会将其设置成 "零值", 而不是其赋值语句的值:
pirvate static int size = 12;
那么在这个阶段, size 的值为 0, 而不是 12. final 修饰的类变量将会赋值成真实的值.
4, 解析
解析过程是将常量池内的符号引用替换成直接引用. 主要包括四种类型引用的解析. 类或接口的解析, 字段解析, 方法解析, 接口方法解析.
5, 初始化
在准备阶段, 类变量已经经过一次初始化了, 在这个阶段, 则是根据程序员通过程序制定的计划去初始化类的变量和其他资源. 这些资源有 static{} 块, 构造函数, 父类的初始化等.
至于使用和卸载阶段阶段, 这里不再过多说明, 使用过程就是根据程序定义的行为执行, 卸载由 GC 完成.
来源: http://www.jianshu.com/p/7585da089656