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 种。
