java 虚拟机类加载机制

虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化。最终形成可以被虚拟机直接使用的java类型。

加载:

类从被加载到虚拟机内存开始,到卸载出内存为止。整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载7个阶段。其中验证、准备、解析3各部分统称为连接

 

 

加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,而解析阶段则不一定:它在某些情况下可以在初始化阶段之后在开始,这是为了支持java语言的运行时绑定(也称为动态绑定或晚期绑定)

类初始化有且只有5种情况(加载、验证、准备自然要在此之前开始):
1、遇到new、getstatic、putstatic或者invokestatic这四条字节码指令时,如果类没有进行过初始化,则需要先出发其初始化。
2、使用java.lang.reflect包的方法对类进行反射调用的时候,如果类还没进行过初始化
3、当初始化一个类的时候,如果发现其父类还没有进行过初始化
4、虚拟机启动时,用户指定要执行的main类
5、当使用jdk1.7动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄
类加载时需要加载的二进制字节流可以从文件、zip包、网络、运行时计算、数据库等地方获取

 

 加载阶段尚未完成,连接阶段可能已经开始 加载阶段与连接阶段的部分内容(如一部分字节码文件格式验证动作)是交叉进行的

验证

确保class文件中的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身安全

...

环境中替换jar包中class文件,高版本向下兼容。 用jdk1.7编译一个class文件替换 1.8的jar包中同名文件 运行不会报错

设置临时jdk(当前窗口有效):

set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_80

set PATH=%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

set CLASSPATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar

class 类文件

 

posted @ 2020-03-04 18:24  gsluofu  阅读(125)  评论(0)    收藏  举报