Java类加载过程是什么

这篇文章主要介绍了Java类加载过程是什么,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。

创新互联公司专注于网站建设|成都网站维护|优化|托管以及网络推广,积累了大量的网站设计与制作经验,为许多企业提供了网站定制设计服务,案例作品覆盖成都砂岩浮雕等行业。能根据企业所处的行业与销售的产品,结合品牌形象的塑造,量身定制品质网站。

Java文件从编码到完成最终执行的过程:

  1. 编译:Javac 把Java文件编译成.class文件
  2. 运行:把.class文件交给JVM运行

类的加载过程

JVM虚拟机把.class文件中类信息加载进内存,并进行解析生成对应的class对象的过程。JVM不是一开始就把所有的类都加载进内存中,而是只有第一次遇到某个需要运行的类时才会加载,且只加载一次。

Java类加载过程是什么

加载

把class字节码文件从各个来源通过类加载器装载入内存中
JVM要完成三件事

  1. 通过一个类的全限定名来获取定义此类的二进制字节流。
  2. 静态存储结构- > 方法区的运行时数据结构
  3. 在Java堆中生成对应类的java.lang.Class对象,作为方法区访问这些数据的访问入口。

类加载器

  • 启动类加载器
  • 扩展类加载器
  • 应用类加载器
  • 自定义类加载器

连接

将java类的二进制代码合并到JVM的运行状态之中的过程

验证

保证加载进来的字节流符合虚拟机规范,不会造成安全错误

验证分类

  • 文件格式的验证,比如常量中是否有不被支持的常量?文件中是否有不规范的或者附加的其他信息
  • 元数据的验证,比如该类是否继承了被final修饰的类?类中的字段,方法是否与父类冲突?是否出现了不合理的重载?
  • 字节码的验证,保证程序语义的合理性,比如要保证类型转换的合理性。
  • 符号引用的验证,比如校验符号引用中通过全限定名是否能够找到对应的类?校验符号引用中的访问性(private,public等)是否可被当前类访问?

准备

为类变量(注意,不是实例变量)分配内存,并且赋予初值(Java虚拟机根据不同变量类型的默认初始值)

默认初始值

  • 8种基本类型的初值,默认为0
  • 引用类型的初值则为null
  • 常量的初值即为代码中设置的值
  • final static tmp = 456

解析

常量池内的符号引用替换为直接引用的过程

符号引用:一个字符串,但是这个字符串给出了一些能够唯一性识别一个方法,一个变量,一个类的相关信息

直接引用:可以理解为一个内存地址,或者一个偏移量

举个例子来说,现在调用方法hello(),这个方法的地址是1234567,那么hello就是符号引用,1234567就是直接引用

解析阶段,虚拟机会把所有的类名,方法名,字段名这些符号引用替换为具体的内存地址或偏移量,也就是直接引用

初始化

对类变量(static修饰的变量或语句)初始化,是执行类构造器的过程

初始化过程

  • 初始化一个类的时候,其父类尚未初始化,则优先初始化其父类
    - 同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行

感谢你能够认真阅读完这篇文章,希望小编分享Java类加载过程是什么内容对大家有帮助,同时也希望大家多多支持创新互联,关注创新互联行业资讯频道,遇到问题就找创新互联,详细的解决方法等着你来学习!


本文标题:Java类加载过程是什么
新闻来源:http://scyanting.com/article/ishijj.html