news 2026/2/16 21:43:15

2026年Java面试八股文(完整版)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
2026年Java面试八股文(完整版)
  1. JVM运行时数据区

    • 线程私有区:
      1. 虚拟机栈:每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等信息,方法执行完毕后释放栈帧
      2. 本地方法栈:为native修饰的本地方法提供的空间,在HotSpot中与虚拟机合二为一
      3. 程序计数器:保存指令执行的地址,方便线程切回后能继续执行代码
    • 线程共享区
      1. 堆内存:Jvm进行垃圾回收的主要区域,存放对象信息,分为新生代老年代
      2. 方法区:存放类信息、静态变量、常量、运行时常量池等信息。JDK1.8之前用持久代实现,JDK1.8后用元空间实现,元空间使用的是本地内存,而非在JVM内存结构中
  2. 什么情况下会内存溢出

    • 堆内存溢出:
      1. 当对象一直不停的创建而不被回收时
      2. 加载的类越来越多时
      3. 虚拟机栈的线程越来越越多时
    • 栈溢出: 方法调用次数过多,一般递归不当造成
  3. JVM有哪些垃圾回收算法

    1. 标记清除算法: 标记不需要回收的对象,然后清除没有标记的对象,会造成许多内存碎片。
    2. 复制算法: 将内存分为两块,只使用一块,进行垃圾回收时,先将存活的对象复制到另一块区域,然后清空之前的区域。用在新生代
    3. 标记整理算法: 与标记清除算法类似,但是在标记之后,将存活对象向一端移动,然后清除边界外的垃圾对象。用在老年代
  4. GC如何判断对象可以被回收

    1. 引用计数法:已淘汰,为每个对象添加引用计数器,引用为0时判定可以回收;这个可能会出现两个对象相互引用无法回收的问题
    2. 可达性分析法:从GCRoot开始往下搜索,搜索过的路径称为引用链,若一个对象GCRoot没有任何的引用链,则判定可以回收
    • GCRoot有:虚拟机栈中引用的对象,方法区中静态变量引用的对象,本地方法栈中引用的对象
  5. 典型垃圾回收器
    G1 :JDK1.9以后的默认垃圾回收器,支持并发,采用标记整理+复制算法,注重响应速度

  6. 类加载器和双亲委派机制

    从父类加载器到子类加载器分别为:

    • BootStrapClassLoader 加载路径为:JAVA_HOME/jre/lib
    • ExtensionClassLoader 加载路径为:JAVA_HOME/jre/lib/ext
    • ApplicationClassLoader 加载路径为:classpath

    还有一个自定义类加载器

    当一个类加载器收到类加载请求时,会先把这个请求交给父类加载器处理,若父类加载器找不到该类,再由自己去寻找。该机制可以避免类被重复加载,还可以避免系统级别的类被篡改

篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc

需要全套面试笔记及答案【点击此处即可/免费获取】​https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho

  1. 类加载过程

    1. 加载:加载字节码文件,将字节码中的静态变量常量转换到方法区,在堆中生成class对象作为方法区入口
    2. 连接:
      • 验证:验证字节码文件的正确性
      • 准备:正式为类变量在方法区中分配内存,并设置初始值
      • 解析:将符号引用解析为直接的一个引用(类在实际内存中的地址)
    3. 初始化:执行类构造器(这里不是常规的构造方法),为静态变量赋值初始化静态代码块
  2. JVM中有哪些引用
    强引用:new的对象。哪怕内存溢出也不会回收
    软引用:只有内存不足时才会回收
    弱引用:每次垃圾回收都会回收(例如:ThreadLocal中的key)
    虚引用:必须配合引用队列使用,一般用于追踪垃圾回收动作

  3. 对象头中有哪些信息
    对象头中有两部分,一部分是MarkWork,存储对象运行时的数据,如GC分代年龄、GC标记、锁的状态、线程ID等;另外一部分是指向对象类型的指针,如果是数组,还有一个部分存放数组长度

  4. JVM内存参数
    -Xmx[]: 堆空间最大内存
    -Xms[]: 堆空间最小内存,一般设置成跟堆空间最大内存一样的
    -Xmn[]: 新生代的最大内存
    -xx[use 垃圾回收器名称]:指定垃圾回收器
    -xss: 设置单个线程栈大小
    一般设堆空间为最大可用物理地址的百分之80

  5. JVM类初始化顺序
    父类静态代码块和静态成员变量->子类静态代码块和静态成员变量->父类代码块和普通成员变量->父类构造方法->子类代码块和普成员变量->子类构造方法

四、Mysql

  1. MyIAm和InnoDB的区别
    InnoDB支持事务,MyIAm不支持
    InnoDB支持外键,MyIAm不支持
    InnoDB是聚簇索引,MyIAm是非聚簇索引
    InnoDB支持行锁和表锁,MyIAm只支持表锁
    InnoDB不支持全文索引,MyIAm支持
    InnoDB支持自增和MVCC模式的读写,MyIAm不支持

  2. Mysql事务特性

    原子性:一个事务内的操作要么成功要么失败会滚,不存在中间状态
    一致性:事务前后的数据总量不变,也就是说一个事务执行之前和执行之后都必须处于一致性状态
    隔离性:是指多个事务并发执行的时候,事务与事务之间相互不影响
    持久性:事务一旦提交发生的改变不可逆的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作

  3. 事务靠什么保证

  4. 事务的隔离级别
    在高并发情况下,并发事务会产生脏读不可重复读幻读问题,这时需要用隔离级别来控制
    1、脏读
    出现原因:一个事务读取到了缓存中另一个事务未提交的脏数据。
    (说明:当事务B对data进行了修改但是未提交事务,此时事务A对data进行读取,并使用事务B修改的数据做业务处理。)
    2、幻读
    出现原因:一个事务在读取数据时,另一个事务插入了数据,导致上个事务第二次读取数据时,数据不一致。
    (说明:data 表有一条数据,事务A对data进行读取, 事务B对data进行数据新增 ,此时事务A读取只有一条数据,而最后实际data是有两条数据,就好象发生了幻觉一样情况成为幻读)
    3、不可重复读
    出现原因:读取数据的同时可以进行修改
    (说明:事务A、事务B同时对data进行访问,事务A对data进行读取,事务B对data进行修改,当事务A第一次对data进行读取完后事务B提交,此时当事务A第二次读取该数据时的数据就与第一次读取的数据不同,这种情况称为不可重复读)

  5. 什么是快照读和当前读

  6. MVCC是什么

    MVCC是多版本并发控制,为每次事务生成一个新版本数据,每个事务都由自己的版本,从而不加锁就决绝读写冲突,这种读叫做快照读。只在读已提交和可重复读中生效。
    实现原理由四个东西保证,他们是

  7. MySQL有哪些索引

  8. 聚簇索引和非聚簇索引的区别

    他们都是b+数结构

  9. B和B+数的区别,为什么使用B+数

  10. MySQL有哪些锁

  11. MySQL如果做慢查询优化

    1. 分析sql语句,是否加载了不需要的数据列
    2. 分析sql执行计划,字段有没有索引,索引是否失效,是否用对索引
    3. 表中数据是否太大,是不是要分库分表

篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc

需要全套面试笔记及答案【点击此处即可/免费获取】​https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho

    1. 哪些情况索引会失效

      1. where条件中有or,除非所有查询条件都有索引,否则失效
      2. like查询用%开头,索引失效
      3. 索引列参与计算,索引失效
      4. 违背最左匹配原则,索引失效
      5. 索引字段发生类型转换,索引失效
      6. mysql觉得全表扫描更快时(数据少),索引失效
    2. Mysql内连接、左连接、右链接的区别

    五、Spring系列

    1. Bean的作用域

      1. Singleton:一个IOC容器只有一个
      2. Prototype:每次调用getBean()都会生成一个新的对象
      3. request:每个http请求都会创建一个自己的bean
      4. session:同一个session共享一个实例
      5. application:整个serverContext只有一个bean
      6. webSocket:一个websocket只有一个bean
    2. Bean的生命周期

      1. 通过构造方法创建bean实例(无参构造)
      2. 为bean的属性设置值和对其它bean引用(调用set方法)
      3. 把bean实例传递bean后置处理器的方法postProcessBeforeInitialization
      4. 调用bean的初始化方法(需要进行配置初始化的方法)
      5. 把bean实例传递bean后置处理的方法postProcessAfterInitialization
      6. bean可以使用了(对象获取到了)
      7. 当容器关闭的时候,调用bean的销毁的方法(需要进行配置销毁的方法)

      如果没有配置后置处理器,bean的生命周期将没有3和5

    3. Spring 事务原理
      spring事务有编程式和声明式,我们一般使用声明式,在某个方法上增加@Transactional注解,这个方法中的sql会统一成功或失败

    4. spring事务失效场景

      1. 事务方法所在的类没有加载到容器中
      2. 事务方法不是public类型
      3. 同一类中,一个没有添加事务的方法调用另外以一个添加事务的方法,事务不生效
      4. spring事务默认只回滚运行时异常,可以用rollbackfor属性设置
      5. 业务自己捕获了异常,那么事务会认为程序正常秩序
    5. spring事务的隔离级别
      default:默认级别,使用数据库自定义的隔离级别
      其它四种隔离级别与mysql一样

    6. spring事务的传播行为

    7. Spring IoC

    8. spring用了哪些设计模式

      1. 简单工厂模式
        • spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定
      2. 工厂方法模式
        • 通常由应用程序直接使用new创建新的对象,为了将对象的创建和使用相分离,采用工厂模式,即应用程序将对象的创建及初始化职责交给工厂对象。
        • 一般情况下,应用程序有自己的工厂对象来创建bean.如果将应用程序自己的工厂对象交给Spring管理,那么Spring管理的就不是普通的bean,而是工厂Bean。
      3. 单例模式
        • 保证一个类仅有一个实例,并提供一个访问它的全局访问点。
        • spring中的单例模式完成了后半句话,即提供了全局的访问点BeanFactory。但没有从构造器级别去控制单例,这是因为spring管理的是是任意的java对象。
      4. 适配器模式
        在Spring的Aop中,使用的Advice(通知)来增强被代理类的功能。Spring实现这一AOP功能的原理就使用代理模式对类进行方法级别的切面增强,即,生成被代理类的代理类, 并在代理类的方法前,设置拦截器,通过执行拦截器重的内容增强了代理方法的功能,实现的面向切面编程。
      5. 包装器模式
        spring中用到的包装器模式在类名上有两种表现:一种是类名中含有Wrapper,另一种是类名中含有Decorator。基本上都是动态地给一个对象添加一些额外的职责。
        6.代理模式
        为其他对象提供一种代理以控制对这个对象的访问。 从结构上来看和Decorator模式类似,但Proxy是控制,更像是一种对功能的限制,而Decorator是增加职责。
        7.观察者模式
        定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
        8.策略模式
        定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。这个模式使得了算法可独立于使用他的客户而变化。

    篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc

    需要全套面试笔记及答案【点击此处即可/免费获取】​https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho

      1. springboot常用注解

        @RestController :修饰,该控制器会返回Json数据
        @RequestMapping(“/path”) :修饰,该控制器的请求路径
        @Autowired : 修饰属性,按照类型进行依赖注入
        @PathVariable : 修饰参数,将路径值映射到参数上
        @ResponseBody :修饰方法,该方法会返回Json数据
        @RequestBody(需要使用Post提交方式) :修饰参数,将Json数据封装到对应参数中
        @Controller@Service@Compont: 将类注册到ioc容器

      版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
      网站建设 2026/2/14 17:33:34

      根据您提供的 package.json 片段,涉及的 @vue/cli-plugin-babel 和 @vue/cli-service 版本为 ~4.2.0。以下是针对该版本的详细解决方案,结合相关依

      根据您提供的 package.json 片段,涉及的 vue/cli-plugin-babel 和 vue/cli-service 版本为 ~4.2.0。以下是针对该版本的详细解决方案,结合相关依赖冲突问题:1. ‌核心依赖冲突处理‌‌问题‌:vue/cli-plugin-babel 和 vue/cli-ser…

      作者头像 李华
      网站建设 2026/2/16 10:37:04

      electron-egg打包win7

      node版本 v16.17.1 项目依赖版本"devDependencies": {"electron/rebuild": "^3.2.5","types/node": "16.18.88","debug": "^4.4.0","ee-bin": "^4.1.10","electron": &q…

      作者头像 李华
      网站建设 2026/2/14 15:27:25

      8种网络故障分析及测试命令大全

      对于网络工程师来说,在平常工作中,最基础的工作能力就是要保证网络顺畅不出错误。但实际上,网络随时都可能发生故障,影响正常工作,从而导致网络工程师总是要背很多黑锅;所以快速解决网络故障已经成为网工的…

      作者头像 李华
      网站建设 2026/2/16 19:03:41

      Pythonselenium自动化测试实战项目

      🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快说明:本项目采用流程控制思想,未引用unittest&pytest等单元测试框架一、项目介绍目的测试某官方网站登录功能模块可以正常使用用例1.输入…

      作者头像 李华
      网站建设 2026/2/14 10:12:55

      关于Comtos Linux (朱雀)主体源码的选择

      关于Comtos Linux (朱雀) 主体源码的选择问: 为什么Comtos Linux 9 (朱雀)不以RHEL 9或 Rocky Linux 9或AlmaLinux 9的稳定的源码为主体,而使用滚动的CentOS Stream 9的源码为主体呢? 使用稳定的RHEL 9或Rocky Linux 9或AlmaLinux 9的源码为…

      作者头像 李华