jvm类加载过程简介说明

打印 上一主题 下一主题

主题 905|帖子 905|积分 2715

转自:
http://www.java265.com/JavaCourse/202204/2708.html
下文笔者将简介JVM 将class文件加载到内存的整个过程简介说明,如下所示:
  1. 类加载的过程主要分为三个部分:
  2.    加载,链接,初始化
  3. 而链接又可以细分为三个小部分:
  4.    验证,准备,解析
复制代码
加载
  1. 加载:将class字节码文件从各个来源通过类加载器装载入内存中
  2.    将class文件字节码内容加载到内存中
  3.   并将这些静态数据转换成方法区中的运行时数据结构
  4. 在堆中生成一个代表这个类的java.lang.Class对象
  5. 作为方法区类数据的访问入口
复制代码
链接
  1. 将java类的二进制代码合并到jvm的运行状态之中的过程
复制代码
验证
  1. 确保加载的类信息符合jvm规范,没有安全方面的问题。
  2. 对于文件格式的验证,比如常量中是否有不被支持的常量?文件中是否有不规范的或者附加的其他信息?
  3. 对于元数据的验证,比如该类是否继承了被final修饰的类?类中的字段,方法是否与父类冲突?是否出现了不合理的重载?
  4. 对于字节码的验证,保证程序语义的合理性,比如要保证类型转换的合理性。
  5. 对于符号引用的验证,比如校验符号引用中通过全限定名是否能够找到对应的类?校验符号引用中的访问性(private,public等)是否可被当前类访问?
复制代码
准备
  1. 正式为类变量(static变量)分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配
  2. 特别需要注意,初值,不是代码中具体写的初始化的值,而是Java虚拟机根据不同变量类型的默认初始值
  3. 比如8种基本类型的初值,默认为0;引用类型的初值则为null;常量的初值即为代码中设置的值,final static tmp = 456, 那么该阶段tmp的初值就是456
复制代码
解析
  1. 虚拟机常量池内的符号引用替换为直接引用的过程
  2. (如String s ="java265",转化为 s的地址指向"java265"的地址)
复制代码
初始化
  1. 此阶段主要是对类变量初始化,执行类构造器的过程
  2. (只对static修饰的变量或语句进行初始化)
  3. 当初始化一个类的时候,其父类尚未初始化,则优先初始化其父类
  4. 当同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行
  5. 当访问一个java类的静态域时,只有真正声明这个静态变量的类才会被初始化
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

三尺非寒

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表