JVM的类加载机制的了解

一、什么是类的加载,作简要描述?

        类的加载就是指:将类的字节码文件(.class文件)回家再到JVM中,存放在运行时数据区的方法区中,然后会在堆中创建一个java.lang.Class对象,这个对象主要用来封装在方法区内的数据结构,并且也想Java程序员提供了访问方法区内的数据结构的接口。

二、字节码文件的加载方式有哪些?

        1、从本地系统中通过类的全限定名去直接加载字节码文件。
        2、通过网络下载字节码文件。
        3、通过jar包等使用字节码问价。
        4、从数据库中提取class字节码文件。
        5、将Java源文件动态的编译为.class文件。

三、类的加载过程,也就是类的生命周期?

        
        类的加载过程包括:加载、验证、准备、解析、初始化这五个阶段。在这五个阶段中:加载、验证、准备、初始化这四个阶段的发生顺序是确定的,而解析的发生顺序不一定,可能会在初始化后会发生,这是为什么?其实是为了支持Java语言的动态绑定。
        1、加载阶段
                
                加载是类加载的第一个阶段,所谓的加载就是查找并且加载类的二进制数据,在这个阶段,Java虚拟机需要完成三件事:
                    第一、需要通过类的全限定名来获取需要的二进制字节流。
                    第二、将这个字节流所代表的静态存储结构转换成方法区的运行时数据结构。
                    第三、在Java堆中会生成一个代表这个类的java.lang.Class对象,作为对方法区中对应数据结构的访问入口。
                相对于类加载的其他阶段而言,加载的可控性是很强的,开发人员不但可以使用系统提供的类加载器来完成加载,同时也是可以使用自定义的类加载器来实现加载。

        2、验证阶段

                验证阶段是类加载的第二阶段,所谓的验证就是确保被加载的类的正确性。
                这一个阶段的目的就是为了确保Class文件的字节流中包含的信息要符合当前虚拟机的要求,并且不会伤害到虚拟机的安全。在这一个阶段会完成4个阶段的检验动作:
                第一、文件格式验证。主要是为了验证字节流是不是符合Class文件格式的规范。
                第二、元数据验证。主要是保证字节码描述的信息符合Java语言规范的要求。
                第三、字节码验证。可以确定程序语义是不是合法的、符合逻辑的。
                第四、符号引用验证。确保解析动作能不能正确执行。
                验证阶段是非常重要的,但是也不一定是必要的,他对程序运行期是没有影响的。可以通过参数关闭大部分的类验证措施,达到缩短虚拟机类加载的时间。

        3、准备阶段

                准备阶段是类加载的第三阶段,主要是为类的静态变量分配内存,并将其初始化为默认值。这些内存都将在方法区中分配。对于这个阶段需要了解的就是:
                第一、准备阶段的内存分配,仅仅只是类的静态变量,而不包括实例变量,实例变量会在对象实例化时随着对象一块分配在Java堆中的。
                第二、这个阶段所设置的初始化值,通常情况下是数据类型默认的零值,而不是在Java代码中指定的值。而真正赋值是在类的初始化阶段实现的。
                第三、如果类字段的字段属性表中存在ConstantValue属性,也就是同时被static和final所修饰,那么在准备阶段变量value就会被初始化为ConstantValue属性所指定的值。

        4、解析阶段

                解析阶段是类加载阶段的第四阶段,主要是把类的符号引用转变为直接引用。符号引用就是一组符号用来描述目标,可以是任何的字面量。直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。
                
        5、初始化阶段

                初始化阶段主要是对类的静态变量去指定真正的初始值。

        类初始化的步骤:
                第一、假如这个类还没有被加载和连接,则程序先加载并连接该类。
                第二、假如该类的直接父类还没有被初始化,则先初始化其直接父类。
                第三、假如类中有初始化语句,则系统依次执行这些初始化语句。

        类的初始化时机:只有对类的主动使用的时候,才会导致类的初始化,类的主动使用包括六种:
                第一、创建类的实例的时候,也就是new的时候。
                第二、访问某个类或接口的静态变量,或者对该静态变量赋值。
                第三、调用类的静态方法。
                第四、反射。
                第五、初始化某个子类,择期父类也会被初始化。
                第六、Java虚拟机启动的时候被表明为启动类的类,那直接使用java.exe命令来运行某个主类。

         结束类的生命周期:
                
                 第一、执行了System.exit()方法
                 第二、程序正常执行结束

                 第三、程序在执行过程中遇到了异常或错误而异常终止

                 第四、由于操作系统出现错误而导致Java虚拟机进程终止















全部评论

相关推荐

Hello_WordN:咱就是说,除了生命其他都是小事,希望面试官平安,希望各位平时也多注意安全
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务