Java:Java JVM常见面试题及答案:类加载器篇


Java:Java JVM常见面试题及答案:类加载器篇
文章图片
1、Class.forName 和 ClassLoader.loadClass 都能加载类 , 这两者在加载类时的区别?

  1. Class.forName有重载方法可以指定是否需要初始化 , 而默认的方法初始化设置为true这会初始化类执行链接和初始化操作
  2. 【Java:Java JVM常见面试题及答案:类加载器篇】ClasaLoader是有类加载器的loadClass方法加载 , 传入的是false , 只会执行连接操作 , 不会初始化操作
2、什么叫类加载器虚拟机把描述类的数据文件(字节码)加载到内存 , 并对数据进行验证、准备、解析以及类初始化 , 最终形成可以被虚拟机直接使用的java类型(java.lang.Class对象) 。
3、类的生命周期
  1. 加载过程:通过一个类的全限定名来获取定义此类的二进制字节流 , 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 。 在内存中(方法区)生成一个代表这个类的java.lang.Class对象 , 作为方法区这个类的各种数据的访问入口;
  2. 验证过程:为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求 , 文件格式验证、元数据验证、字节码验证、符号引用验证
  3. 准备过程:正式为类属性分配内存并设置类属性初始值的阶段 , 这些内存都将在方法区中进行分配
  4. 解析阶段:虚拟机将常量池内的符号引用替换为直接引用的过程
  5. 初始化阶段:类初始化阶段是类加载过程的最后一步 。 初始化阶段就是执行类构造器<clint>()方法的过程
  6. 使用阶段:
  7. 卸载阶段:
4、类加载器类加载器负责加载所有的类 , 同一个类(一个类用其全限定类名(包名加类名)标志)只会被加载一次 。
  1. Bootstrap ClassLoader:根类加载器 , 负责加载java的核心类 , 它不是java.lang.ClassLoader的子类 , 而是由JVM自身实现
  2. Extension ClassLoader:扩展类加载器 , 扩展类加载器的加载路径是JDK目录下jre/lib/ext扩展类的getParent()方法返回null实际上扩展类加载器的父类加载器是根加载器 , 只是根加载器并不是Java实现的
  3. Application ClassLoader:应用程序类加载器 , 它负责在JVM启动时加载来自java命令的-classpath选项、java.class.path系统属性或CLASSPATH环境变量所指定的jar包和类路径 。 程序可以通过getSystemClassLoader()来获取系统类加载器 。 系统加载器的加载路径是程序运行的当前路径 。
双亲委派模型的工作过程
  1. 先查找当前ClassLoader是否加载过此类 , 有就返回;
  2. 如果没有 , 查询父ClassLoader是否已经加载过此类 , 如果已经加载过就直接返回Parent加载的类;
  3. 如果整个类加载器体系上的ClassLoader都没有加载过 , 才由当前ClassLoader加载(调用findClass) , 整个过程类似循环链表一样 。
双亲委托机制的作用