每天面向对象编程,却大部分都没有对象的Java程序员们,最近工作还顺利么?每个Java程序员每天都在和虚拟机打交道,可虚拟机你真的了解么?今天,我们一起来聊一下虚拟机的类加载.
其实在Java代码中,类型加载,连接和初始化过程都是在程序运行期间完成的,上边这句话有四个点需要着重解释一下
我们先来看一下类型吧,在Java语言中,类型的描述光有.class,还有接口,枚举,这些类型都是提前编译好的.然后是加载,加载指的是一个过程,该过程描述的是将已经编译好的.class文件从磁盘读取到运行时内存中的过程.加载完成之后,虚拟机要进行连接过程,这个过程中主要做的事情就是1.将类与类之间的关系确定好.2.处理校验字节码文件(对于校验字节码文件来说,做Java开发的程序员可能会有疑问,.class文件都是编译器编译好的,怎么会有错误呢?没有错误为什么要校验呢?其实.class文件在生成之后,有可能会被恶意修改,比如用专门编辑类文件的软件打开,然后进行修改).
最后要解释一下初始化,简而言之,初始化就是对静态变量赋值.
虚拟机这样设计,是为了给程序开发提供更大的灵活性,增加了许多可能性.
类加载是一个过程,类加载器是进行类加载过程的工具,接下来我们聊一聊类加载器.类加载器运行依附于Java虚拟机,而虚拟机会在什么情况下结束自己的生命周期呢?
首先,在程序执行了System.exit();方法的时候,这时候虚拟机算是正常退出.
再者,程序执行完成,虚拟机会正常退出.
还有,当程序在执行过程中遇到了异常或错误而终止.比如,主函数调用了有错误的函数,函数会将错误一层一层向上抛,抛到主函数之后,虚拟机打印错误信息,并结束此次生命周期 最后,就是外界的问题了,比如遇到操作系统错误,导致Java虚拟机进程终止.
粗略的聊了一下虚拟机退出的原因,我们来详细的聊一下类加载过程.
类加载可分为加载,连接,初始化三个过程,在加载过程中, 类加载器会查找并加载类的二进制数据. 加载完成之后, 类加载器会进行到连接阶段,在此阶段虚拟机首先会校验二进制文件,确保该文件没有被恶意篡改.校验成功之后,虚拟机进行到准备阶段,该阶段类加载器会加载静态变量,并为静态变量分配内存,并将静态变量初始化为默认值.比如,Java代码中定义了一个public static int a=1;在此阶段变量a会被赋值为0.
准备阶段完成之后,程序要进行到解析阶段,在该阶段,类加载器会把类中的符号引用变为直接引用.符号引用,指的是间接引用的方式.
最后进行的阶段就是初始化了,该阶段类加载器会将类的静态变量赋予正确的初始值比如上边的将初始化为0的变量变为1;
类的使用和卸载:
使用:程序正常运行.
卸载:字节码文件在内存中形成自己的数据结构,执行卸载过程的时候,类文件会从内存中销毁.