Skip to content

Java 后端程序员面试八股文

Java基础篇

(此处可根据需要补充具体内容)

并发编程篇

(此处可根据需要补充具体内容)

JVM 篇

1. 知识点汇总

JVM 主要包括类加载机制、运行时数据区(线程私有:程序计数器、虚拟机栈、本地方法栈;线程共享:堆、方法区)、垃圾收集机制、类加载器、执行引擎等。

2. 知识点详解

  • 类加载机制:加载、验证、准备、解析、初始化。
  • 运行时数据区:堆(新生代 Eden、Survivor,老年代)、方法区(元空间)、栈、程序计数器。
  • 垃圾回收:判断对象存活(引用计数、可达性分析)、回收算法(标记-清除、标记-整理、复制、分代收集)。

3. 说说类加载与卸载

类加载过程:加载(查找字节码文件)、链接(验证、准备、解析)、初始化(执行静态代码)。 卸载:当类不再被任何对象引用,且类加载器也被回收时,可被卸载(通常自定义类加载器场景)。

4. 简述一下 JVM 的内存模型

线程私有区

  • 程序计数器:记录当前线程执行字节码的行号。
  • 虚拟机栈:存储局部变量表、操作数栈、动态链接、方法出口。
  • 本地方法栈:类似虚拟机栈,但服务 Native 方法。

线程共享区

  • 堆:存储对象实例,几乎所有对象分配在此。
  • 方法区:存储类信息、常量、静态变量、JIT 编译代码(JDK8 后用元空间实现)。

5. 说说堆和栈的区别

  • 堆:存储对象实例和数组,线程共享,GC 管理,大小动态。
  • 栈:存储基本类型变量、对象引用、方法调用帧,线程私有,速度快,先进后出。

6. 什么时候会触发 Full GC

  • 老年代空间不足。
  • 元空间不足。
  • System.gc() 调用。
  • Young GC 后 Survivor 区放不下晋升对象。
  • 大对象直接进入老年代时空间不足。

7. 什么是 Java 虚拟机?为什么 Java 被称作是“平台无关的编程语言”?

Java 虚拟机(JVM)是运行 Java 字节码的虚拟计算机。 Java 源代码编译成字节码(.class),字节码在不同平台的 JVM 上运行,实现“一次编译,到处运行”,故平台无关。

8. Java 内存结构

同第 4 题:程序计数器、虚拟机栈、本地方法栈、堆、方法区。

9. 说说对象分配规则

  • 对象优先在 Eden 区分配。
  • 大对象直接进入老年代。
  • 长期存活对象进入老年代(年龄阈值,默认 15)。
  • 动态年龄判断:Survivor 区相同年龄对象总大小 > Survivor 一半,直接晋升。

10. 描述一下 JVM 加载 class 文件的原理机制?

双亲委派模型:启动类加载器 → 扩展类加载器 → 应用类加载器 → 自定义加载器。请求向上委托,加载向下执行,避免重复加载和安全问题。

11. 说说 Java 对象创建过程

  • 类加载检查。
  • 分配内存(指针碰撞或空闲列表)。
  • 初始化零值。
  • 设置对象头(类元信息、hashcode、GC 分代年龄)。
  • 执行 <init> 方法。

12. 对象了的生命周期吗?

创建 → 使用 → 不可达 → 可回收 → 回收(finalize 可自救一次)。

13. 简述 Java 的对象结构

  • 对象头:Mark Word(锁状态、hashcode、年龄)、类指针、数组长度(若数组)。
  • 实例数据:字段值。
  • 对齐填充。

14. 如何判断对象可以被回收?

  • 引用计数法(循环引用问题)。
  • 可达性分析:从 GC Roots(虚拟机栈引用、方法区静态引用、本地方法栈 JNI 引用、常量引用)出发,不可达即回收。

15. JVM 的永久代中会发生垃圾回收吗?

JDK7 前永久代可能回收常量池和卸载类;JDK8 后元空间用本地内存,回收类似。

16. 你知道哪些垃圾收集算法

  • 标记-清除:速度快,碎片多。
  • 标记-整理:无碎片,开销大。
  • 复制:无碎片,浪费空间。
  • 分代收集:新生代复制,老年代标记-清除/整理。

常见收集器:Serial、ParNew、CMS、G1、ZGC。

17. 调优命令有哪些?

  • jps、jstat、jinfo、jmap、jhat、jstack、jcmd。
  • 可视化:JConsole、VisualVM。

Spring Boot 篇

1. 为什么要用 Spring Boot

简化 Spring 配置、自动配置、内嵌容器、快速启动、生产就绪特性(监控、健康检查)。

2. Spring Boot 的核心注解是哪个?它主要由哪几个注解组成

@SpringBootApplication,由 @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan 组成。

3. 运行 Spring Boot 有哪几种方式?

  • main 方法运行。
  • mvn spring-boot:run。
  • jar 包 java -jar。

4. 如何理解 Spring Boot 中的 Starters?

Starters 是依赖管理器,一站式引入相关依赖(如 spring-boot-starter-web)。

5. 如何在 Spring Boot 启动的时候运行一些特定的代码?

实现 CommandLineRunner 或 ApplicationRunner 接口的 run 方法。

6. Spring Boot 需要独立的容器运行吗?

不需要,内嵌 Tomcat/Jettty/Undertow。

7. Spring Boot 中的监视器是什么?

Actuator,提供生产就绪特性,如 /actuator/health、metrics。

8. 如何使用 Spring Boot 实现异常处理?

@ControllerAdvice + @ExceptionHandler。

9. 你如何理解 Spring Boot 中的 Starters?

同第 4 题,简化依赖管理。

10. springboot 常用的 starter 有哪些

web、data-jpa、test、actuator、security、jdbc 等。

11. Spring Boot 实现热部署有哪几种方式?

spring-boot-devtools、JRebel、Spring Loaded。

12. 如何理解 Spring Boot 配置加载顺序?

properties/yml 文件:classpath > classpath:/config > file > file:/config;优先级从高到低。

13. Spring Boot 的核心配置文件有哪几个?它们的区别是什么?

application.properties 和 application.yml,yml 层次更清晰,支持复杂结构。

14. 如何集成 Spring Boot 和 ActiveMQ?

引入 spring-boot-starter-activemq,配置连接工厂,使用 JmsTemplate。

MySQL 篇

1. 数据库的三范式是什么

  • 1NF:原子性。
  • 2NF:消除部分依赖。
  • 3NF:消除传递依赖。

2. MySQL 数据库引擎有哪些

InnoDB(默认)、MyISAM、Memory、CSV 等。

3. 说说 InnoDB 与 MyISAM 的区别

  • InnoDB 支持事务、行锁、外键、崩溃恢复;MyISAM 支持表锁、全文索引、空间小。
  • InnoDB 聚簇索引,MyISAM 非聚簇。

4. 数据库的事务

ACID:原子性、一致性、隔离性、持久性。

5. 索引是什么

加速查询的数据结构(如 B+ 树)。

6. SQL 优化手段有哪些

  • 使用索引。
  • 避免 select *。
  • 优化子查询为 join。
  • 分页 limit。
  • EXPLAIN 分析。

7. 简单说说 drop、delete 与 truncate 的区别

  • drop 删除表结构。
  • delete 删除数据,可回滚。
  • truncate 删除数据,不可回滚,重置自增。

8. 什么是视图

虚拟表,由查询结果组成。

9. 什么是内连接、左外连接、右外连接?

  • 内:交集。
  • 左外:左表全 + 匹配右。
  • 右外:右表全 + 匹配左。

10. 并发事务带来哪些问题?

脏读、不可重复读、幻读、丢失更新。

11. 事务隔离级别有哪些?MySQL 的默认隔离级别是?

未提交读、提交读、可重复读(默认)、串行化。

12. 分库分表之后,id 主键如何处理?

雪花算法、UUID、数据库自增步长、Redis 生成等。

13. 说说在 MySQL 中一条查询 SQL 是如何执行的?

连接器 → 查询缓存(8.0 移除) → 分析器 → 优化器 → 执行器 → 存储引擎。

14. 索引有什么优缺点?

优:加速查询;缺:占用空间、降低写性能。

15. MySQL 中 varchar 与 char 的区别?varchar(30) 中的 30

char 固定长度,varchar 可变;30 是最大字符数。

16. int(11) 中的 11 代表什么含义?

显示宽度(zerofill 时有效),不影响存储。

MyBatis 篇

1. 什么是 MyBatis

半自动 ORM 框架,支持自定义 SQL、存储过程、高级映射。

2. 说说 MyBatis 的优点和缺点

优:灵活 SQL、解耦;缺:SQL 手动写、工作量大。

3. #{} 和 ${} 的区别是什么?

#{} 预编译,防注入;${} 字符串拼接,易注入。

4. 当实体类中的属性名和表中的字段名不一样,怎么办?

resultMap 映射,或 @Results。

5. MyBatis 是如何进行分页的?分页插件的原理是什么?

RowBounds 内存分页;插件拦截 StatementHandler,修改 SQL 加 limit。

6. MyBatis 是如何将 sql 执行结果封装为目标对象并返回的

resultMap 或自动映射。

7. 如何执行批量插入?

<foreach> 循环,或 executorType=BATCH。

8. Xml 映射文件中,除了常见的 select|insert|update|delete 标签之外,还有哪些

<cache><resultMap><sql> 等。

9. MyBatis 实现一对一有几种方式?具体怎么操作的?

association(嵌套结果/查询);一对多 collection。

10. MyBatis 是否支持延迟加载?如果支持,它的实现原理是什么吗?

支持,association/collection lazyLoadingEnabled,基于代理。

11. 说说 MyBatis 的缓存机制

一级(SqlSession)、二级(命名空间)。

12. JDBC 编程有哪些步骤?

加载驱动、获取连接、创建 Statement、执行 SQL、处理结果、关闭资源。

13. MyBatis 中见过什么设计模式?

建造者、工厂、代理、适配器等。

14. MyBatis 中比如 UserMapper.java 是接口,为什么没有实现类还能调用?

JDK 动态代理,MapperProxy。

Spring 篇

1. 什么是 Spring

轻量级开源框架,核心 IOC 和 AOP。

2. 你们项目中为什么使用 Spring 框架?

IOC 解耦、AOP 切面、事务管理、集成方便。

3. @Autowired 和 Resource 关键字的区别?

Autowired 按类型,Resource 按名(JSR-250)。

4. 依赖注入的方式有几种,各是什么?

构造器、setter、字段注入。

5. 讲一下什么是 Spring

同第 1。

6. 说说你对 Spring MVC 的理解

基于 MVC 的 Web 框架,DispatcherServlet 前控制器。

7. Spring MVC 常用的注解有哪些?

@Controller、@RequestMapping、@GetMapping 等。

8. 谈谈你对 Spring 的 AOP 理解

面向切面,解耦横切关注(如事务、日志)。

9. Spring AOP 和 AspectJ AOP 有什么区别?在 Spring AOP 中,关注点和横切关注的区别是什么?什么是通知呢?有哪些类型呢?

Spring AOP 运行时代理,AspectJ 编译时织入。 关注点:业务逻辑;横切:日志等。 通知:前置、后置、环绕、异常、最终。

10. 说说你对 Spring 的 IOC 是怎么理解的?

控制反转,容器管理对象创建和依赖。

11. 解释一下 Spring Bean 的生命周期

实例化 → 属性赋值 → 初始化(Aware → BeanPostProcessor 前 → InitializingBean → init-method → BeanPostProcessor 后) → 使用 → 销毁。

12. 解释 Spring 支持的几种 Bean 的作用域?

singleton(默认)、prototype、request、session、globalSession。

13. Spring 基于 xml 注入 Bean 的几种方式?

构造器、setter、静态工厂、实例工厂。

14. Spring 框架中都用到了哪些设计模式?

工厂、代理、单例、模板、观察者等。

15. 说说 Spring 中 ApplicationContext 和 BeanFactory 的区别

ApplicationContext 继承 BeanFactory,提供更多功能(如国际化、事件)。

16. 说说事务的传播级别

REQUIRED(默认)、SUPPORTS、REQUIRES_NEW 等 7 种。

Released under the MIT License.