十、类的生命周期

一、请问什么是java虚拟机的生命周期?java虚拟机如何结束生命周期?

答:java虚拟机进程从启动到终止的过程,称为java虚拟机的生命周期。在以下情况下,java虚拟机将结束生命周期:

①程序正常执行结束。

②程序在执行过程中出现异常或错误而异常终止。

③执行了System.exit()方法。

④由于操作系统出现错误而导致java虚拟机进程终止。

二、 请问类的加载指的是什么?

答:是指把类的.class文件中的二进制数据读入到内存中,把它存放在运行时数据区的方法内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。

类的最终产品是位于运行时数据区的堆区的Class对象,Class对象封装了类在方法区内的数据结构,并且向java程序提供了访问类在方法区内的数据结构的接口。

三、请问java虚拟机如何加载类的二进制数据?

答:①从本地文件系统中加载类的.class文件,这是最常见的加载方式。

②通过网络下载类的.class文件。

③从ZIP、JAR或其他类型的归档文件中提取.class文件。

④从一个专有数据库中提取.class文件。

⑤把一个java源文件动态编译为.class文件。

四、请问类的加载是由谁完成的?并有哪几种?

答:类加载器完成的。可分为两种:

①Java虚拟机自带的加载器:包括启动类加载器、扩展类加载器和系统类加载器。

②用户自定义的类加载器:是java.lang.ClassLoader类的子类的实例,用户可以通过它来定制类的加载方式。

五、请问类加载器是类被使用的时候加载的吗?

答:不是。类的加载器并不需要等到某个类抽首次主动使用时再加载它,java虚拟机规范允许类加载器在预料某个类要被使用时就预先加载它,如果在预先加载过程中遇到.class文件缺失或者存在错误,类加载器必须等到程序首次主动使用该类时才报告错误。如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误。

六、请问类的连接是什么?连接过程包括什么?

答:类的连接就是把已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去。

连接过程包括类的验证、类的准备和类的解析。

七、请问由java编译器生成的java类的二进制数据肯定是正确的,为什么还要进行类的验证呐?

答:因为java虚拟机并不知道某个特定的.class文件到底是如何被创建的,这个.class文件有可能是由正常的java编译器生成的,也可能是由黑客特制的(黑客试图通过它来破坏虚拟机的运行环境),类的验证能提高程序的健壮性,确保程序被安全的执行。

八、请问类的验证是什么?包括什么?

答:类的验证保证被加载的类有正确的内部结构,并且与其他类协调一致。如果java虚拟机检查到错误,就会抛出相应的Error对象。主要包括以下内容:

①类文件的结构检查;

②语义检查;

③字节码验证;

④二进制兼容验证。

九、请问类的准备是干什么?

答:java虚拟机为类的静态变量分配内存,并设置默认的初始值。

十、请问类的解析阶段干什么?

答:java虚拟机会把类的二进制数据中的符号引用替换为直接引用。

十一、请问类的初始化阶段干什么?

答:java虚拟机执行类的初始化语句,为类的静态变量赋予初始值。

十二、请问静态变量如何初始化?

答:①在静态变量的声明处进行初始化;

②在静态代码中进行初始化。

十三、请问本类和本类的直接父类初始化顺序是如何的?

答:如果类存在直接的父类,并且这个父类还没有被初始化,那么就先初始化直接的父类。

十四、程序对类或接口的主动使用有哪些?

答:①创建类的实例;

②调用类的静态方法;

③访问某个类或接口的静态变量,或者对该静态变量赋值。

④调用javaAPI中某些反射方法;

⑤初始化一个类的子类;

⑥java虚拟机启动时被标明的启动类。

十五、请问类的加载器用来干什么?采取什么机制?

答:用来把类加载到java虚拟机中。类的加载过程采用父亲委托机制,这种机制能更好地保证java平台的安全。在委托机制中,除了java虚拟机自带的根类加载器以外,其余的类加载器都有且只有一个父加载器。当java程序请假加载器请假加载器loader1加载某类时,loader1首先委托自己的父加载器区加载某类,若父加载器能加载,则由父加载器完成加载任务,否则才由加载器loader1本身加载某类。

十六、请问java虚拟机自带什么加载器?

答:①根(Bootstrap)类加载器:该类加载器没有父加载器,它负责加载虚拟机的核心类库。根类加载器的实现依赖于底层操作系统,属于虚拟机实现的一部分,它没有继承java.lang.ClassLoader。

②扩展(Extension)类加载器:它的父类加载器是跟类加载器,它从系统属性所指定的目录或者jdk安装目录的子目录下加载类库。扩展类加载器是纯Java类,是java.lang.ClassLoader类的子类。

③系统(System)类加载器:也称为应用类加载器,它的父加载器为扩展类加载器。它从环境变量或者系统属性所指定的目录中加载类,它是用户自定义的类加载器的默认父加载器。系统类加载器是纯Java类,是java.lang.ClassLoader类的子类。

十七、请问类何时卸载?

答:一个类何时结束生命周期,取决于它们的类对象何时结束生命周期。

由java虚拟机自带的类加载器所加载的类,在虚拟机的生命周期中,始终不会被卸载。java虚拟机本身会始终引用这些类加载器,而这些类加载器则会始终引用它们所加载的类的Class对象。由用户自定义的类加载器所加载的类是可以被卸载的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值