JVM面试题

一:类的生命周期是怎么样的?

大的阶段可以分为类的加载、类的使用、以及类的卸载。类的加载阶段又分为加载、链接、初始化。其中连接过程又包含了验证、准备和解析。
JVM面试题_第1张图片

二:Java中类加载的过程是怎么样的?

Java中类的加载阶段分为加载、链接、初始化。其中连接过程又包含了验证、准备和解析。
类的加载:类的加载指的是将类的.class文件中的二进制数据读取到内存中,存放在运行时数据区的方法区中,并创建一个大的Java.lang.Class对象,用来封装方法区内的数据结构
链接阶段
链接阶段:Java类加载器对类进行验证、准备和解析操作。

  1. 验证:校验类的正确性(文件格式,元数据,字节码,二进制兼容性)
  2. 准备:为类的静态变量分配内存,将其初始化为默认值。但是在到达初始化之前,类变量都没有初始化为真正的初始值。当然,对于final修饰的变量来说,会在此时就被初始化为指定值
  3. 解析:把类的符号引用转为直接引用(类或接口、字段、类方法、接口方法、方法类
    型、方法句柄和访问控制修饰符7类符号引用)

三:Java中的类什么时候会被加载?

Java中的类在以下几种情况中会被加载:

  1. 当创建类的实例时,如果该类还没有被加载,则会触发类的加载。例如,通过关键字new创建一个类的对象时,JVM会检查该类是否已经加载,如果没有加载,则会调用类加载器进行加载。
  2. 当使用类的静态变量或静态方法时,如果该类还没有被加载,则会触发类的加载。例如,当调用某个类的静态方法时,JVM会检查该类是否已经加载,如果没有加载,则会调用类加载器进行加载。
  3. 当使用反射机制访问类时,如果该类还没有被加载,则会触发类的加载。例如,当使用
    Class.forName()方法加载某个类时,JVM会检查该类是否已经加载,如果没有加载,则会调用类加载器进行加载.
  4. 当JVM启动时,会自动加载一些基础类,例如java.lang.Object类和java.lang.Class类等。
    总之,Java中的类加载其实是延迟加载的,除了一些基础的类以外,其他的类都是在需要使用类时才会进行加载。同时,Java还支持动态加载类,即在运行时通过程序来加载类,这为java程序带来了更大的灵活性。

四:什么是双亲委派?如何破坏?

如果一个类加载器收到了类加载的请求,它并不会自己先去加载,而是把这个请求委托给父类加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类的加载器可以完成类的加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式
如何破坏:双亲委派模型主要是由ClassLoader#loadclass 实现的,我们只需要自定义类加载器,并且重写其中的loadClass方澪,即可破坏双亲委派模式。

你可能感兴趣的:(jvm,jvm)