Java文件从编码到完成终究实行的历程:
- 编译:Javac 把Java文件编译成.class文件
- 运转:把.class文件交给JVM运转
类的加载历程
JVM虚拟机把.class文件中类信息加载进内存,并举行剖析生成对应的class对象的历程。JVM不是一开始就把一切的类都加载进内存中,而是只要第一次碰到某个须要运转的类时才会加载,且只加载一次。
加载
把class字节码文件从各个泉源经由过程类加载器装载入内存中
JVM要完成三件事
- 经由过程一个类的全限命名来猎取定义此类的二进制字撙节。
- 静态存储组织- > 要领区的运转时数据组织
- 在Java堆中生成对应类的java.lang.Class对象,作为要领区接见这些数据的接见进口。
类加载器
- 启动类加载器
- 扩大类加载器
- 运用类加载器
- 自定义类加载器
衔接
将java类的二进制代码合并到JVM的运转状况当中的历程
考证
保证加载进来的字撙节相符虚拟机范例,不会形成平安毛病
考证分类
- 文件花样的考证,比方常量中是不是有不被支撑的常量?文件中是不是有不范例的或许附加的其他信息
- 元数据的考证,比方该类是不是继续了被final润饰的类?类中的字段,要领是不是与父类争执?是不是涌现了不合理的重载?
- 字节码的考证,保证递次语义的合理性,比方要保证范例转换的合理性。
- 标记援用的考证,比方校验标记援用中经由过程全限命名是不是可以找到对应的类?校验标记援用中的接见性(private,public等)是不是可被当前类接见?
预备
为类变量(注重,不是实例变量)分派内存,而且给予初值(Java虚拟机依据差别变量范例的默许初始值)
默许初始值
- 8种基础范例的初值,默许为0
- 援用范例的初值则为null
- 常量的初值即为代码中设置的值
- final static tmp = 456
剖析
常量池内的标记援用替换为直接援用的历程
标记援用:一个字符串,然则这个字符串给出了一些可以唯一性辨认一个要领,一个变量,一个类的相干信息
直接援用:可以理解为一个内存地点,或许一个偏移量
举个例子来讲,如今挪用要领hello(),这个要领的地点是1234567,那末hello就是标记援用,1234567就是直接援用
剖析阶段,虚拟机会把一切的类名,要领名,字段名这些标记援用替换为详细的内存地点或偏移量,也就是直接援用
初始化
对类变量(static润饰的变量或语句)初始化,是实行类组织器的历程
初始化历程
- 初始化一个类的时刻,其父类还没有初始化,则优先初始化其父类
- 同时包括多个静态变量和静态代码块,则按照自上而下的递次顺次实行
以上就是Java类加载历程的细致引见的细致内容,更多请关注ki4网别的相干文章!