`
huhu_long
  • 浏览: 69077 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JVM 类加载机制

    博客分类:
  • JVM
阅读更多
编译时 VS 运行时
编译时将 Java 源文件编译成 字节码 Class文件。
运行时将对 Class 文件进行类加载。

类加载就是指 虚拟机 加载 Class 文件到内存的过程。

该过程包括
1. 对数据的校验
2. 转换解析
3. 初始化

关于动态加载, 是指运行期再指定其具体的实现。 比如在使用接口的时候,到运行时采取指定其具体的实现。

----------------------------- 我是分割线 -----------------------------
类的生命周期
1. 加载
2. 验证 (连接)
3. 准备 (连接)
4. 解析 (连接)
5. 初始化
6. 使用
7. 卸载

加载-
1. 通过类的权限定名 com/vrplat/Test 加载类的二进制流
2. 将二进制流结构转换成方法区的数据结构 (不同的JVM不同的实现)
3. 在堆中生成一个Class对象

验证-
1. 文件格式验证 (开头的魔术,版本号,编码等等。。)
2. 元数据验证 (语义分析, 比如是否继承了一个final的类, 是否重写了final的方法)
3. 字节码验证 (比如,类型转化,父类强制转化成子类验证就会出错)
4. 符号引用验证 (比如:通过权限定名能否找到类,当前类对其他类/字段/方法的访问性private/protected/public/default)

准备-
1. 就是给类变量(静态变量)分配内存并设置零值的过程。
2. 比如: public static int value = 123; 准备过程就是在方法区给value分配内存并将其赋零值0. 而真正的值123要等到初始化的时候才确定。

解析-
1. 将符号引用替换成直接引用
2. 符号引用在验证阶段只是确定能否找到该类,或者说是Class文件。而将它替换成直接引用之后则是可以直接在内存中访问到。

需要初始化的几种场景
1. 虚拟机启动的时候,要初始化一个可执行的类(包括main方法的那个类)
2. 当碰到new, getstatic, putstatic, invokestatic字节码指令的时候, 如果类没有初始化则要先初始化 (读取直接静态字段-非父类的字段,final常量在编译期间就已经初始化好了,不在此内)
3. 当初始化一个类时发现父类还没有初始化,则要先初始化父类。 而对于接口来说,只有当真正使用到父接口(比如引用父接口的常量)才会对父接口的初始化
4. 使用反射的时候





分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics