jvm类加载机制有哪些,jvm的加载顺序
如何解决写爬虫IP受阻的问题?立即使用。
本教程运行环境:windows7系统,java8版本8,DELL G3电脑。
要理解JVM的类加载过程,需要回答两个问题:
1.什么时候加载类?
2.类是如何加载的。
一、触发类加载的条件:
类的加载过程主要分为七个阶段:加载、验证、准备、解析、初始化、使用、卸载;加载、验证、准备、初始化、卸载这五个过程的顺序是确定的,jvm必须严格遵循这个顺序。jvm没有规定类加载的时间,但是严格规定了类在五种情况下必须立即初始化,加载自然在那之前。
1.遇到new、getstatic、putstatic、invokestatic这四个指令时,如果类没有初始化,先初始化类。
2.用java.lang.reflect包的方法对类进行反射调用时,如果类没有初始化,就会触发它的初始化。
3.初始化一个类时,如果该类的父类没有初始化,首先触发其父类的初始化。
4.要运行JVM,必须指定一个包含main方法的main类,虚拟机首先初始化这个类。
5.使用Jdk1.7的动态语言支持时,如果java.lang.invoke.MethodHandle实例的方法句柄最终解析结果为REF_getstatic、REF_putstatic和REF_inokestatic,且该方法句柄对应的类尚未初始化,则触发类初始化。
二、类加载过程
类加载过程主要分为加载、验证、准备、解析、初始化、使用、卸载七个阶段。
1、加载:
1)通过类的完全限定名加载相应的二进制字节流。由主类装入器实现。
2)将字节流表示的静态存储结构转换成方法区的运行时数据结构。
3)在内存中生成一个代表这个类的java.lang.Class对象,作为方法区每个类访问这个类的入口。(Hotspot在方法区域生成这个类)。
2、验证:
1)文件格式验证:验证类文件的幻版本号常量是否在当前虚拟机支持的范围内。
2)元数据验证:验证一个类的语义信息是否符合java语言规范的要求。
3)字节码验证:验证程序的语义合法,符合规范。主要通过stackmapframe结构。
4)符号引用验证:虚拟机正在将符号引用转换为直接引用,验证符号引用的全限定名所表示的类是否可以找到,对应的域和方法是否可以找到,访问权限是否合法。
3、准备:
在准备阶段,类变量(由静态修饰符修改)在方法区域中被分配和初始化。
数据类型 | 零值 | 数据类型 | 零值 |
---|---|---|---|
int | 0 | boolean | false |
long | 0L | float | 0.0f |
short | 0 | double | 0.0d |
char | '\u0000' | reference | null |
byte | 0 |
1)、类或接口解析:将符合的引用转换成类的直接引用,检查访问权限。
2)字段解析:将字段的符号引用转换为字段的类信息或其父类的直接引用,并检查访问权限。
3)类方法解析:将类方法的符号引用转换为类方法所属的类信息或其父类的字段的直接引用,并检查访问权限。
4)接口方法解析:将接口方法的符号引用转换为接口方法所属的接口信息或其父类的直接引用,并检查访问权限。
5、初始化:
在初始化阶段,编译器会结合类文件声明的静态赋值变量和静态区域,生成cinit方法并调用。
类加载器:类加载器是“通过类的完全限定名加载类的二进制字节流”的实现。对于任何类,虚拟机中的唯一性是由类加载器和类本身决定的。
母公司委托模式:
1.Bootstrap ClassLoader启动类加载器,它负责加载Java _ home/lib/rt.jar .
2.扩展ClassLoader扩展了类加载器,负责加载JAVA_HOME/lib/ext下的包。
3.应用程序类加载器应用程序类加载器负责加载类路径下的JAVA类库。
4.用户定义的类装入器。
父子模型加载类的方式是,当类加载器收到加载类的请求时,它首先委托父类加载类。所有的类加载器都采用这种方式,所以所有的类加载请求都会到达最顶层的父类,当父类加载失败时,就会加载到类加载器中。这样,类装入器之间就有了层次关系,可以保证Java的基本类都由同一个类装入器装入,对Java系统的稳定性起着至关重要的作用。
相关视频教程推荐:Java视频教程以上是jvm类加载过程各阶段的细节。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。