Java类加载机制高频面试题及详细答案_第1页
Java类加载机制高频面试题及详细答案_第2页
Java类加载机制高频面试题及详细答案_第3页
Java类加载机制高频面试题及详细答案_第4页
Java类加载机制高频面试题及详细答案_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java类加载机制高频面试题及详细答案一、基础概念类1.什么是Java类加载机制?类加载的时机是什么?参考答案:Java类加载机制就是JVM把编译好的.class字节码文件,加载到内存中,转换成可以直接使用的java.lang.Class对象的过程。简单说,就是把磁盘上的静态字节码数据,变成内存中的运行时类对象。类不会在程序启动时全部加载,而是按需延迟加载,触发加载的核心时机有这几种:主动new一个类的实例对象调用类的静态方法、静态变量(final常量除外)使用反射方式创建类对象、调用类方法初始化子类时,会优先加载父类程序启动时的main方法所在主类而访问final修饰的静态常量、仅仅声明类的引用,不会触发类加载。2.简述类加载的完整生命周期,分为哪几个阶段?参考答案:类加载完整生命周期分为5个核心阶段,其中前三个是加载阶段,后两个是链接阶段,最后还有初始化阶段:加载:读取.class字节码文件,将二进制数据读入内存,在方法区生成对应的Class对象验证:校验字节码的合法性,包括格式、语义、引用合法性等,防止非法、恶意字节码破坏JVM运行准备:为类的静态变量分配内存,并赋予默认初始值(int=0、boolean=false、引用=null),不会赋值自定义初始值解析:把代码中的符号引用(字面量符号)替换成内存中的直接内存地址引用初始化:这是类加载的最后一步,也是主动加载的终点。执行静态代码块、静态变量的自定义赋值,按照代码顺序初始化静态资源。补充:日常说的类加载,广义包含以上5个阶段,狭义仅指第一步加载阶段。3.类的准备阶段和初始化阶段的核心区别是什么?参考答案:很多开发者容易混淆这两个阶段,核心差异在赋值规则和执行内容:准备阶段:只给静态变量分配内存、赋JVM默认值,不执行任何开发者定义的代码。比如staticinta=10,准备阶段a的值是0,不是10。初始化阶段:执行开发者自定义的静态赋值、静态代码块,按照代码书写顺序执行。上面的a会在这个阶段被赋值为10。例外:staticfinal修饰的基本类型常量,在编译期就会确定值,准备阶段直接赋值,不会等到初始化阶段。二、类加载器核心考点4.JVM自带的类加载器有哪些?各自的加载范围和优先级?参考答案:JDK8及以前默认三层原生类加载器,自上而下优先级从高到低,加载范围逐层扩大:启动类加载器(BootstrapClassLoader)扩展类加载器(ExtensionClassLoader)应用类加载器/系统类加载器(ApplicationClassLoader)JDK9及以上引入模块系统,加载器机制略有调整,但面试核心仍以三层加载器为主。5.什么是双亲委派模型?工作流程是什么?参考答案:双亲委派模型是JVM默认的类加载机制规则,核心原则是:子类加载器收到加载请求,不会自己先加载,而是先委托父加载器处理,层层向上委托,顶层加载器无法加载时,再由子类加载器自己加载。完整工作流程:应用类加载器收到类加载请求向上委托给扩展类加载器扩展类加载器继续向上委托给启动类加载器启动类加载器判断自己的加载范围,能加载则直接加载,返回结果启动类加载器无法加载,下沉给扩展类加载器,扩展类加载器无法加载,再下沉给应用类加载器最终由应用类加载器完成项目自定义类的加载注意:双亲委派是向上委托,向下加载,所有加载请求优先交给上层。6.双亲委派模型的好处是什么?为什么需要这个机制?参考答案:主要有两个核心优势,也是面试高频得分点:保证核心类安全,防止核心API被篡改保证类的全局唯一性,避免重复加载7.双亲委派模型是可以被打破的吗?有哪些打破场景?参考答案:可以打破。双亲委派是默认规范,不是强制语法约束,只要重写类加载器的loadClass方法,就能改变委托逻辑。常见的打破场景有3种:JDK早期版本(1.2之前)SPI机制(服务提供者接口)热加载、热部署、模块化场景三、进阶高频面试题8.什么是类的全盘负责、双亲委派、缓存机制?三者区别?参考答案:这是类加载器的三大核心特性,各自作用不同:缓存机制:所有加载过的Class对象都会被缓存到方法区,下次需要使用该类时,直接从缓存获取,不会重复加载,提升加载效率。全盘负责机制:一个类加载器加载了某个类后,该类依赖的其他类、引用的类,默认也由这个加载器负责加载,保证类加载的统一性。双亲委派机制:前面讲的向上委托加载规则,保证类安全和唯一性。9.自定义类加载器怎么实现?核心重写哪个方法?参考答案:自定义类加载器只需继承ClassLoader抽象类,核心掌握两个方法的区别:loadClass():实现双亲委派逻辑的入口方法,如果要打破双亲委派,重写这个方法findClass():真正读取字节码、定义类的方法,如果只是扩展加载规则(加载自定义路径字节码),只重写findClass即可,保留默认双亲委派标准开发规范:尽量只重写findClass,不随意重写loadClass,避免破坏原生安全机制。自定义类加载器主要用于热部署、加密class文件、加载外部动态jar包等场景。10.说说Tomcat的类加载器机制,为什么要打破双亲委派?参考答案:Tomcat为了实现多web应用隔离、热部署、版本兼容,自定义了WebappClassLoader,打破了默认的双亲委派,采用先自己加载,再委托父加载器的规则。核心原因:隔离不同web项目的同名类:不同项目可以存在全限定名一致的类,互不干扰支持热部署:项目更新class文件后,可通过新的类加载器重新加载,无需重启服务优先加载项目自身jar包,避免服务器全局jar包覆盖项目依赖,解决版本冲突11.Class.forName()和ClassLoader.loadClass()的区别?参考答案:两者都是反射加载类,核心区别在于是否触发类初始化:Class.forName("全类名"):默认执行类加载全过程,会完成加载、链接、初始化,会执行静态代码块和静态变量赋值。JDBC注册驱动就是用这个方法,因为需要执行驱动的静态注册代码。ClassLoader.loadClass("全类名"):只执行加载、链接阶段,不会执行初始化阶段,不会触发静态代码块执行。只有在实例化对象时,才会初始化类。补充:forName也有重载方法,可以手动指定是否初始化类。12.什么是类的卸载?类可以被卸载吗?条件是什么?参考答案:Java的类可以被卸载,但是JDK原生三层加载器加载的类无法卸载,只有自定义类加载器加载的类才能被卸载。类卸载的三个必要条件,缺一不可:该类的所有实例对象已经被GC回收,没有任何存活实例该类的Class对象没有任何引用,无法被访问加载该类的自定义类加载器对象已经被GC回收这也是热部署的核心原理:销毁旧的类加载器和旧类,创建新的类加载器加载新的class文件。四、面试压轴题13.你在项目中哪里用到了类加载机制?实际场景是什么?参考答案(项目实战口述版):日常开发中很多框架底层都依赖类加载机制,我接触过的典型场景有两个:第一,JDBC驱动加载。早期JDBC需要Class.forName()加载驱动类,利用的就是类加载初始化阶段会执行静态代码块,完成驱动注册,这里就用到了类加载的初始化特性,以及SPI打破双亲委派的机制。第二,SpringBoot热部署、插件化项目。项目devtools热部署功能,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论